解题报告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 }
View Code
原文地址:https://www.cnblogs.com/verlen11/p/4179257.html