解题报告1005 幻方
做幻方
Time Limit:1000MS Memory
Limit:1024K
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开始数到最后,相信你会发现其中的规律。当然输出也要按照这样的格式。刚开始写是从中心开始挑着写,其实用计算机的思维想一想,按顺序来看就好了。
然后今天比较晕,行和列分不清楚,因为这个原因写了很久。
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 }