ACM-1998
奇数阶魔方
没有什么具体问题:
知道算法即可
注意:杭电的编译器--要把所有变量的声明都放在最前面
注意输出格式
具体代码如下:
#include <stdio.h>
int main()
{
int num;
int n;
int result[20][20];
int i,j;
int k;
scanf("%d",&num);
while(num--){
scanf("%d",&n);
if(n%2==0)continue;
for(i =0;i<20;i++){
for(j = 0;j<20;j++){
result[i][j] = -1;
}
}
i = 0;
j = n/2;
result[i][j]=1;
/************************************************************************
N为奇数时
(1) 将1放在第一行中间一列;
(2) 从2开始直到n×n为止各数依次按下列规则存放:
向右上方存放
每一个数存放的行比前一个数的行数减1,列数加1
(3) 如果行列范围超出矩阵范围,则回绕。
假如x在第1行,则x+1应放在最下一行即第n行,列数同样为x所在的列数加1;
假如x在第n列,则x+1应放在第一列,行数同样为x所在的行数减1。
(4) 如果按上面规则确定的位置上已有数,或者上一个数是第1行第n列时,
则把下一个数放在上一个数的下面。
************************************************************************/
for(k = 2;k<=n*n;k++){
if(i==0&&j==n-1){
i=i+1;
}else{
int x,y;
x = i;
y = j;
i = i-1;
j = j+1;
if(i<0){
i = n-1;
}
if(j>n-1){
j = 0;
}
if(result[i][j] !=-1){
i = x+1;
j = y;
}
}
result[i][j]=k;
}
for(i=0;i<n;i++){
for(j=0;j<n;j++){
printf("%4d",result[i][j]);
}
printf("\n");
}
}
return 0;
}