Professional Documents
Culture Documents
Bài Tập Lớn Số 1
Bài Tập Lớn Số 1
Ngày 9/10/2023
Điểm
INPUT OUTPUT
1.2 Sơ đồ khối :
Start Sang()
vector<string> vs;
s<1||s>45 vs.push_back(x);
i++<1e5 snt(i)&&tcs(i)
Hàm inmat(mat)
thiết lập mảng
solve(mat,vs,0,s) điều kiện
char a[5];
(tcs(a)==s&&
j==11 snt[stoi(a)])
hàm seta(mat,a,j);
kiemtra
i<n=vs.size() dien(mat,a,j)
(vs[i],a)
i++
Reset lại ma
dien(mat,vs[i],j); trận tại sau
solve(mat,vs,j+1,s); khi duyệt
hết trường
hợp ở bước j
void seta(char (*mat)[5], char *a,int j){ // thiết lập mảng điều kiện cho số
if(j!=2 && j!=11){
if (!j || (j%2 && j>1) ){
for(int i=0;i<5; i++){
if(!j)
a[i]=mat[j][i];
else
a[i]=mat[j-(j/2 +1)][i];
}
}
else {
for(int i=0; i<5; i++){
if(j==1)
a[i]=mat[i][j-1];
else
a[i]=mat[i][(j-2)/2];
}
}
}
else {
for(int i=0; i<5; i++){
if(j==2)
a[i]=mat[i][4-i];
else
a[i]=mat[i][i];
}
}
}
void inmat(char(*mat)[5]){ // in ma trận
for(int i=0; i<5; i++){
for(char c:mat[i])
cout<<c<<" ";
cout << endl;
}
}
void solve(char (*mat)[5], vector<string> vs, int j,int s){//hàm giải ma trận
char a[5];
seta(mat,a,j);// thiết lập mảng điều kiện
if(j==11){ // bước kiểm tra đường chéo chính 1 (bước cuối)
if(tcs(a) == s && snt[stoi(a)]){
inmat(mat);
cout << endl;
}
}
else{
for(int i=0, n=vs.size(); i<n; i++){
if(kiemtra(vs[i],a)){ // khi tìm thấy 1 số thoả mãn đk,
điền vào ma trận
dien(mat,vs[i],j);
solve(mat,vs,j+1,s); // đệ quy tìm số tiếp theo
}
}
dien(mat,a,j); // reset lại ma trận tại sau khi duyệt hết trường
hợp ở bước j
}
}
main(){
sang();
int s;
do{
cin >> s;
}
while(s<1 || s>45);
vector<string> vs; // vector vs chứa các số nguyên tố 5 chữ số có tổng
các chữ số = s
for(int i=1e4; i<SIZE; i++){
if(snt[i]){
string x = to_string(i);
if(tcs(x)==s)
vs.push_back(x);
}
}
int n=vs.size();
char mat[5][5];
for(int i=0; i<5; i++)
memset(mat[i],'-',5); // khởi tạo ma trận 5x5 chứa '-'
solve(mat,vs,0,s);
}