N*N阶幻方问题
解决方法:
从第一行中间为 1 开始:向左上方移动,遇到空格子就赋一个递增的值;
如果超出了整个矩阵的范围,可以想象有同样的矩阵衔接上并继续;
如果一个格子已经有值了,那就向下移动然后继续。
代码:
#include<cstdio>
#include<cstdlib>
#include<string>
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iomanip>
using namespace std;
int main()
{
int n;
while(~scanf("%d",&n))
{
if(!(n%2))
{
cout<<n<<" is even"<<endl;
continue;
}
int square[100][100];
memset(square,0,sizeof(square));
square[0][(n-1)/2]=1;
int j=(n-1)/2,k,l,i=0;
for(int key=2;key<=n*n;key++)
{
k=(i)?(i-1):(n-1);
l=(j)?(j-1):(n-1);
if(square[k][l])
i=(i+1)%n;
else
{
i=k;
j=l;
}
square[i][j]=key;
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
cout<<setw(5)<<square[i][j];
}
cout<<endl;
}
}
return 0;
}