幻方的要求:每一行,每一列,还有两条斜线上数字的和都相等.(以下程序输入的 n 要求 n<30 并且 n 为奇数,输入0 结束) 构造 1 :#include <stdio.h>#include <string.h> void out(int n){ int i,j,k,a[32][32]; memset(a,0,sizeof(int)*32*32); j=n/2+1; a[1][j]=1; for(k=2;k <= n*n; k ++){ i=i-1; j=j+1; if((i<1)&&(j>n)){ i=i+2; j=j-1; } else{ if(i<1) i=n; if(j>n) j=1; } if(a[i][j]==0) a[i][j]=k; else{ i=i+2; j=j-1; a[i][j]=k; } } for(i=1;i<=n;i++){ for(j=1;j<=n;j++) printf("%d ",a[i][j]); printf("\n"); }} int main(){ int n; while( scanf("%d",&n) != EOF ){ if(n == 0) break; out( n ); printf("\n"); } return 0;} // 测试用例:输入:3590输出:8 1 63 5 74 9 2 17 24 1 8 1523 5 7 14 164 6 13 20 2210 12 19 21 311 18 25 2 9 47 58 69 80 1 12 23 34 4557 68 79 9 11 22 33 44 4667 78 8 10 21 32 43 54 5677 7 18 20 31 42 53 55 666 17 19 30 41 52 63 65 7616 27 29 40 51 62 64 75 526 28 39 50 61 72 74 4 1536 38 49 60 71 73 3 14 2537 48 59 70 81 2 13 24 35 构造2:#include <stdio.h>#include <string.h> void out(int n){ int i,j,k,a[32][32]; memset(a,0,sizeof(int)*32*32); j=n/2+1; a[n][j]=1; for(i=n,k=2;k <= n*n; k++){ i++; j++; if(i>n && j>n){ i-=2; j--; } else{ if(i>n) i=1; else if(j>n) j=1; } if(a[i][j]==0) a[i][j]=k; else{ i-=2; j--; a[i][j]=k; } } for(i=1;i<=n;i++){ for(j=1;j<=n;j++) printf("%d ",a[i][j]); printf("\n"); }} int main(){ int n; while( scanf("%d",&n) != EOF ){ if(n == 0) break; out( n ); printf("\n"); } return 0;} // 测试用例:输入:3590输出:4 9 23 5 78 1 6 11 18 25 2 910 12 19 21 34 6 13 20 2223 5 7 14 1617 24 1 8 15 37 48 59 70 81 2 13 24 3536 38 49 60 71 73 3 14 2526 28 39 50 61 72 74 4 1516 27 29 40 51 62 64 75 56 17 19 30 41 52 63 65 7677 7 18 20 31 42 53 55 6667 78 8 10 21 32 43 54 5657 68 79 9 11 22 33 44 4647 58 69 80 1 12 23 34 45 构造3:#include<stdio.h>int main(){ int t,i,j; while(1){ scanf("%d",&t); if(t==0) break; for(i=1;i<=t;i++) for(j=1;j<=t;j++){ printf("%d ",((j+i+(t-3)/2) % t)*t+(j-i+(3*t-1)/2) % t +1); if(j==t) printf("\n"); } printf("\n"); } return 0;}// 测试用例:输入:3590输出:8 3 41 5 96 7 2 18 24 5 6 1222 3 9 15 161 7 13 19 2510 11 17 23 414 20 21 2 8 50 60 70 80 9 10 20 30 4058 68 78 7 17 27 28 38 4866 76 5 15 25 35 45 46 5674 3 13 23 33 43 53 63 641 11 21 31 41 51 61 71 8118 19 29 39 49 59 69 79 826 36 37 47 57 67 77 6 1634 44 54 55 65 75 4 14 2442 52 62 72 73 2 12 22 32 也许还有其它的构造方法,而且得到的幻方可能都不相同

评论