Description:
Apple最近迷上了做幻方,Apple还是个中高手,只要你说个奇数N就能把N*N的幻方做出来。其实你可以比他做得更好的。Apple总是画得很乱,而你可以利用程序排得很整齐^_^ 幻方的要求:每一行,每一列,还有两条斜线上数字的和都相等
Input:
每行一个数N(0< N < 30),输入0结束Output:
输入一个奇数,输出一个幻方,每个数占3格,顺序参照样板输出,输出完以后加一个回车。Sample Input:
5
1
0
Sample Output:
11 18 25 2 9
10 12 19 21 3
4 6 13 20 22
23 5 7 14 16
17 24 1 8 15
1
Hint:
如果不会做幻方的请从1开始数到最后,相信你会发现其中的规律。当然输出也要按照这样的格式Source:
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int i,j,k,n;
int a[31][31];
while(cin>>n,n)
{
memset(a,0,sizeof(a));
i=n-1;j=n/2;
a[i][j]=1;//先将最下面一行中间位置置1
for(k=2;k<=n*n;k++)
{
if(a[(i+1)%n][(j+1)%n]==0)
{i=(i+1)%n; j=(j+1)%n;}
else i=(i-1+n)%n;
a[i][j]=k;
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{cout<<setw(3)<<a[i][j];}
cout<<endl;
}
cout<<endl;
}
system("pause");
return 0;
}
记:关键是确定下一个数填的位置,规律是:1以后的每一个数只能填在它所在位置的下一行的下一行(记为A),如果A已经有数,就把下一个数填在当前这个数的上面(即与这个数同一列的上一个位置)