首页 > 代码库 > 解题报告1005 幻方

解题报告1005 幻方

做幻方
Time Limit:1000MS  Memory Limit:1024K

Description:

Apple最近迷上了做幻方,Apple还是个中高手,只要你说个奇数N,他就能把N*N的幻方做出来。其实你可以比他做得更好的。Apple总是画得很乱,而你可以利用程序排得很整齐^_^ 幻方的要求:每一行,每一列,还有两条斜线上数字的和都相等。

 

Input:

每行有一个数N(0< N < 30),输入0结束。

Output:

输入一个奇数,输出一个幻方,每个数占3格,顺序参照样板输出,输出完以后加一个回车。

Sample Input:

510

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开始数到最后,相信你会发现其中的规律。当然输出也要按照这样的格式。
 
刚开始写是从中心开始挑着写,其实用计算机的思维想一想,按顺序来看就好了。
然后今天比较晕,行和列分不清楚,因为这个原因写了很久。
 
技术分享
 1 #include <iostream> 2 #include <iomanip> 3 using namespace std; 4 int main() 5 { 6     int n; 7     while(cin>>n) 8     { 9         if(n==0)10             break;11         int **a=new int*[n];12         for(int i=0;i<n;i++)13              a[i]=new int[n];14          for(int i=0;i<n;i++)15              for(int j=0;j<n;j++)16                  a[i][j]=0;17         18         int c=1;19         int j=(n-1)/2;20         for(int i=n-1;i>=0;i++)21         {22             if(c!=1&&(c-1)%n==0)23             {24                 if(j==0)25                     j=n-1;26                 else j=j-1;27                 if(i==0)28                     i=n-2;29                 else if(i==1)30                     i=n-1;31                 else i=i-2;32             }33             a[i][j]=c++;34             j++;35             if(c==n*n+1) break;36             if(i==n-1)37                 i=-1;38             if(j==n)39                 j=0;40         }    41         for(int i=0;i<n;i++)42          {43              for(int j=0;j<n;j++)44                  cout<<setw(3)<<a[i][j];45              cout<<endl;46          }47          cout<<endl;48     }49     return 0;50 }
View Code

 

解题报告1005 幻方