东莞高端品牌网站建设,怎么在网上卖东西视频,南京百度网站建设,嘉兴做网站美工的工作题干#xff1a;
C语言_魔方阵
描述 魔方阵是一个古老的智力问题#xff0c;它要求在一个mm的矩阵中填入1#xff5e;m2的数字#xff08;m为奇数#xff09;#xff0c;使得每一行、每一列、每条对角线的累加和都相等#xff0c;如下为5阶魔方阵示例。
15 8 1 24 17…题干
C语言_魔方阵
描述 魔方阵是一个古老的智力问题它要求在一个m×m的矩阵中填入1m2的数字m为奇数使得每一行、每一列、每条对角线的累加和都相等如下为5阶魔方阵示例。
15 8 1 24 17 16 14 7 5 23 22 20 13 6 4 3 21 19 12 10 9 2 25 18 11 输入 输入一个数n表示矩阵的大小保证n100且n为奇数 输出 输出一个矩阵每个元素之间以一个空格分隔
答案不唯一输出一个题目要求的矩阵即可 输入样例 1
5
输出样例 1
15 8 1 24 17
16 14 7 5 23
22 20 13 6 4
3 21 19 12 10
9 2 25 18 11 解题报告 可以找到规律构造以1n/21这个点为1然后向左上扩展如果最上面了就循环到最下面如果到最左边了就循环到最右边如果该点被填过值了那就到他下面那个点然后就可以构造出这个图形了。
刚开始是用搜索写的
#includebits/stdc.husing namespace std;
int n,flag,sum;
bool vis[505];
int maze[505][505];
bool fitr1(int x) {int res 0;for(int i 1; in; i) {res maze[x][i];}if(res ! sum) return 0;else return 1;
}
bool fitr2(int x ,int y){int res 0;for(int i 1; iy; i) {res maze[x][i];}if(res sum) return 0;else return 1;}
bool dui(int x,int y) {int res 0;for(int i 1; ix; i) {res maze[i][i];}if(res sum ) return 0;res 0;for(int i 1; ix; i) {res maze[i][n-i1];}if(res sum ) return 0;return 1;
}
bool fitc(int x,int y) {int res 0;for(int i 1; ix; i) {res maze[i][y];}if(res sum) return 0;else return 1;
}
bool ff() {int resr[105] {0},resc[105] {0},res 0;for(int i 1; in; i) {for(int j 1; jn; j) {resr[i] maze[i][j];resc[j] maze[i][j];}}for(int i 1; in; i) {if(resr[i] ! sum || resc[i] ! sum) return 0;}//for(int i 1; in; i) res maze[i][i];if(res ! sum ) return 0;res 0;for(int i 1; in; i) res maze[i][n-i1];if(res ! sum ) return 0;return 1;
}
void dfs(int x,int y) {
// printf(x %d y %d\n,x,y);if(x n1) {if(ff()) flag 1;return ;}if(flag 1) return ;for(int i 1; in*n; i) {if(vis[i]) continue;maze[x][y] i;if(flag 1) return ;if(x y) {if(!dui(x,y)) continue;}
// if(!fitc(x,y)) continue;if(y n) {
// if(!fitr1(x)) continue;vis[i] 1;dfs(x1,1);if(flag 1) return ;vis[i] 0;}else {
// if(!fitr2(x,y)) continue;vis[i]1;dfs(x,y1);if(flag 1) return ;vis[i] 0;}}
}
int main()
{cinn;for(int i 1; in*n; i) {sum i;}sum/n;dfs(1,1);for(int i 1; in; i) {for(int j 1; jn; j) {printf(%d%c,maze[i][j],jn ? \n : );}}return 0 ;
}
然而发现只能输入3的时候输出输入5的时候就跑不出来了。最后一项也是9^15次方肯定跑不出来呀。
AC代码
#includecstdio
#includequeue
#includestring
#includecstring
#includecmath
#includemap
#includeiostream
#includealgorithm
#define ll long long
const ll mod 1e97;
using namespace std;
int maze[105][105];
int main()
{int n;cinn;maze[1][(n1)/2] 1;int cur2,tmp n;int x 1,y (n1)/2;while(cur n*n) {if(x 1) {if(y 1) {maze[x1][y] cur;x;tmp n;continue;}else {for(int i 1; in; i) {if(maze[tmp][y-1] ! 0) tmp--;else break;}maze[tmp][y-1] cur;xtmp;y--;tmp n;}}else if(y 1) {for(int i 1; in; i) {if(maze[x-1][tmp] ! 0) tmp--;else break;}maze[x-1][tmp] cur;x--;ytmp;tmpn;}else if(maze[x-1][y-1] ! 0 ) {maze[x1][y] cur;x;}else {maze[x-1][y-1] cur;x--,y--;}}for(int i 1; in; i) {for(int j 1; jn; j) {printf(%d%c,maze[i][j],j n ? \n : );}}return 0 ;
}