n阶魔方
题目
n阶魔方 :将1~n^2个数填写到一个由n行n列的方阵中,使得每一行每一列及两个对角线上的数字之和分别等于同一个数。称这个方阵为一个n阶魔方
示例
当n=3时, 每行之和为15,如图
6 | 1 | 8 |
---|---|---|
7 | 5 | 3 |
2 | 9 | 4 |
分析
第一步:元素的位置记为(i,j),第一个元素为(0,n/2)
第二步:下一个元素(i1,j1)为(i,j)的左上角位置处,及(i1=i-1,j1 = j-1); 对于这个位置有两种情况:
- 若(i1,j1)有数字,则修改i1与j1的值i1=i+2,j1=j+1
- 若i1<0&&j1>=0时,修改i1=n-1;
若j1<0&&i1>=0.修改j1=n-1
代码
void MAGIC(int A[][MaxZise],int n){
int i,j,num;
// 初始化,默认为0
for ( i = 0; i < n; i++)
for ( j = 0; j < n; j++)
A[i][j]=0;
i=0;
j=n/2; // i与j的初始位置
for ( num = 0; num < n*n; num++) {
if (i<0&&j<0||A[i][j]!=0) {
i+=2;
j++;
}
A[i--][j--]=num;
if (i<0&&j>=0) {
i=n-1; // 修改i的位置
}
if (j<0&&i>=0) {
j=n-1; // 修改J的位置
}
}// for
}
显然 时间复杂度为O(n^2).