首页 > 代码库 > 1.8.22

1.8.22

22:神奇的幻方

总时间限制:
1000ms
内存限制:
65535kB
描述

幻方是一个很神奇的N*N矩阵,它的每行、每列与对角线,加起来的数字和都是相同的。
我们可以通过以下方法构建一个幻方。(阶数为奇数)
1.第一个数字写在第一行的中间
2.下一个数字,都写在上一个数字的右上方:
    a.如果该数字在第一行,则下一个数字写在最后一行,列数为该数字的右一列
    b.如果该数字在最后一列,则下一个数字写在第一列,行数为该数字的上一行
    c.如果该数字在右上角,或者该数字的右上方已有数字,则下一个数字写在该数字的下方

输入
一个数字N(N<=20)
输出
按上方法构造的2N-1 * 2N-1的幻方
样例输入
3
样例输出
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
 1 /*2016年12月4日openjudge日常水题
 2   ————1.8.22     By Lxzy_Zby*/
 3 #include<cstdio>
 4 #include<cstring>
 5 using namespace std;
 6 bool b[101][101];
 7 int a[101][101];
 8 int main()
 9 {
10     int N,n=2;//n定义第一次赋值 
11     scanf("%d",&N);
12     int x=0,y=(2*N)/2-1;//定义(x,y)初始坐标 
13     a[0][(2*N)/2-1]=1;//初始化第一行中间数为1 
14     memset(b,0,sizeof(b));//bool数组初始化 
15     b[0][(2*N)/2-1]=1;//初始化第一行中间数bool值为1 
16     int ans=(2*N-1)*(2*N-1)+1,ans1=2*N-2;
17     while(1)
18     {
19         if(N==1)break;// 单独处理N为1的数据 
20         if(x==0&&y!=ans1) //a种情况 
21         {
22             x=2*N-2,y+=1;
23             a[x][y]=n;
24             n++;
25             b[x][y]=1;
26         }
27         else
28         {
29             if(y==ans1&&x!=0) //b种情况 
30             {
31                 x-=1,y=0;
32                 a[x][y]=n;
33                 n++;
34                 b[x][y]=1;    
35             }
36             else
37             {
38                 if(b[x-1][y+1]==1||x==0&&y==ans1&&b[0][ans1]==1)//c种情况 
39                 {
40                     x++;
41                     a[x][y]=n;
42                     n++;
43                     b[x][y]=1;
44                 }
45                 else
46                 {
47                     if(b[x-1][y+1]==0)//正常情况 
48                     {
49                         x--;
50                         y++;
51                         a[x][y]=n;
52                         b[x][y]=1;
53                         n++;
54                     }
55                 }
56                 
57             }
58         }
59         if(n==ans)
60         break;//如果本次循环结束后最后一个赋值的坐标值为(2N-1)*(2N-1)则退出循环 
61     }
62     for(int i=0;i<=ans1;i++)
63      {
64          for(int j=0;j<=ans1;j++)
65            printf("%d ",a[i][j]);
66            printf("\n");
67      }
68     return 0;
69 } 

 

1.8.22