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("\n");
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 }
原文链接: https://www.cnblogs.com/baikequanshu/p/3491525.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/116637
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!