N阶幻方,思路如下:
把1(或最小的数)放在第一行正中; 按以下规律排列剩下的n*n-1个数:
(1)、每一个数放在前一个数的右上一格;
(2)、如果这个数所要放的格已经超出了顶行那么就把它放在底行,仍然要放在右一列;
(3)、如果这个数所要放的格已经超出了最右列那么就把它放在最左列,仍然要放在上一行;
(4)、如果这个数所要放的格已经超出了顶行且超出了最右列,那么就把它放在前一个数的下一行同一列的格内;
(5)、如果这个数所要放的格已经有数填入,处理方法同(4)。
1 #include "stdafx.h" 2 #include <stdlib.h> 3 const int Max = 100; 4 int k;//游标K 5 6 //排列N阶数组 7 void Rank(int x[Max][Max],int r, int c,int n) 8 { 9 //放置第一个值 10 x[r][c] = 1; 11 for(k = 2; k <= n*n; k++) 12 { 13 //游标右上方向移一次。 14 r--; 15 c++; 16 //超出顶行但未超出右列 17 if(r < 0 && c< n) 18 { 19 r = n - 1; 20 x[r][c] = k; 21 continue; 22 } 23 //超出右列但未超出顶行 24 if(r >= 0 && c > n - 1) 25 { 26 c = 0; 27 x[r][c] = k; 28 continue; 29 } 30 //超出顶行且超出右列 31 if(r < 0 && c > n - 1) 32 { 33 //恢复前一个数的位置 34 r++; 35 c--; 36 //下移一行 37 r = r + 1; 38 x[r ][c] = k; 39 continue; 40 } 41 //如果有数 42 if(x[r][c] != 0) 43 { 44 //恢复前一个数的位置 45 r++; 46 c--; 47 //下移一行 48 r = r + 1; 49 x[r][c] = k; 50 continue; 51 } 52 else 53 x[r][c] = k; 54 } 55 56 //幻方建立完毕,开始输出 57 for(int s = 0;s < n;s++) 58 { 59 for(int l = 0; l < n; l++) 60 { 61 printf("%4d",x[s][l]); 62 } 63 printf(" "); 64 } 65 } 66 67 68 int _tmain(int argc, _TCHAR* argv[]) 69 { 70 //初始化一个二维数组 71 int m[Max][Max] = {0}; 72 //定义初始行列值 73 int r ,c; 74 //幻方阶数 75 int n; 76 printf("请输入幻方阶数:"); 77 scanf("%d",&n); 78 //判断阶数是不是奇数 79 while(n % 2 == 0) 80 { 81 printf("输入的幻方阶数不对,请重新输入幻方阶数:"); 82 scanf("%d",&n); 83 } 84 //获得初始行列值 85 r = 0; 86 c = n / 2; 87 //排列幻方 88 Rank(m,r,c,n); 89 system("Pause"); 90 return 0; 91 }