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 }
时间: 2024-10-15 19:00:32