zjut1005 做幻方

来源:互联网 发布:dota2手机直播软件 编辑:程序博客网 时间:2024/06/06 07:23

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已经有数,就把下一个数填在当前这个数的上面(即与这个数同一列的上一个位置)

0 0
原创粉丝点击