Defination
幻方是一种将数字安排在正方形格子中,使每行、列和对角线上的数字和都相等的方法
Rules
- 第一个数从第一行的正中间开始填,依次填入2,3,…
- 每一个数放在前一个数的右上一格
- 如果这个数所要放的格已经超出了顶行那么就把它放在底行,仍然要放在右一列
- 如果这个数所要放的格已经超出了最右列那么就把它放在最左列,仍然要放在上一行
- 如果这个数所要放的格已经有数填入,那么就把它放在前一个数的下一行同一列的格内
Example
input
5
output
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
My answer
#include <stdio.h>
#include <stdlib.h>
void move(int a[][101],int *x,int *y,int *lx,int *ly,int n){
int tempx=(*lx);
int tempy=(*ly);
//记录上一个数的坐标,应对下一个数的位置已经有人占领了的情况
*lx=*x;
*ly=*y;
if((*x)==0) (*x)=n-1;
else (*x)--;
if((*y)==n-1) (*y)=0;
else (*y)++;
if(a[*x][*y]!=0){
(*x)=tempx;
(*y)=tempy+1;
if((*y)>n-1) *y=0;
}
}
int main()
{
int n,num=1;
scanf("%d",&n);
int a[101][101];
int i,j,x,y,lx,ly;
for(i=0;i<101;i++){
for(j=0;j<101;j++){
a[i][j]=0;
}
}
lx=0;
ly=(n-1)/2;
a[lx][ly]=1;
x=n-1;
y=(n-1)/2+1;
for(num=2;num<=n*n;num++){
a[x][y]=num;
move(a,&x,&y,&lx,&ly,n);
}
for(i=0;i<n;i++){
for(j=0;j<n;j++){
printf("%d ",a[i][j]);
}
printf("\n");
}
return 0;
}