N阶幻方

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

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月10日 下午3:54
下一篇 2023年2月10日 下午4:08

相关推荐