n阶幻方问题:设n为奇数(n∈[3, 19])。试在n´n的表格内不重复地填上1, 2, …, n2数字,使得横向、纵向、两对角线上数之和都相等。
1#include<stdio.h>
2#include<malloc.h>
3//此程序适用于幻方问题
4//奇数阶幻方问题
5
6
7//初始化函数
8void init(int n,int **rect)
9{
10 int i = 0;
11 int j = 0;
12 for(i = 0;i<n;i++)
13 {
14 for(j = 0;j<n;j++)
15 {
16 rect[i][j] = 0;
17 }
18 }
19}
20
21//计算函数
22void pro(int n,int **rect)
23{
24 /**//*奇数阶幻方问题的规则是
25 1 把1放到第一行的正中间
26 2 其他数都放到上一个数的右上角
27 3 如果是在第一行,那么把它的行数变为n,列数加1
28 4 如果是在最后一列,则行数减1 列数变为1
29 5 当然了,上面3 4 两种情况只有最右上角的一个格会同时发生,而当它发生的时候,就把该元素直接放到右上角那个元素的下面即可
30 6 如果后续的数所处的位置已有数,则行数加1 列数不变
31
32 */
33
34
35 int i = 0;
36 int j = 0;
37 int currentNum = 2;
38 int final = n*n;
39 j = n/2;
40 rect[i][j] = 1;//把1放到中间的位置
41 for(;currentNum<=final;currentNum++)
42 {
43 j++;
44 i--;
45 //首先处理右上角的元素
46 if(i<0 && j== n)
47 {
48 i+= 2;
49 j--;
50 }
51 else
52 {
53 if(i<0)
54 {
55 i = n-1;
56 }
57 if(j == n)
58 {
59 j = 0 ;
60 }
61 }
62
63 if(rect[i][j] != 0)
64 {
65
66 i+=2;
67 j--;
68 }
69 rect[i][j] = currentNum;
70 }
71
72}
73
74
75//打印输出函数
76void print(int n ,int **rect)
77{
78 int i = 0;
79 int j = 0;
80 for(i = 0;i<n;i++)
81 {
82 for(j= 0;j<n;j++)
83 {
84 printf("%d ",rect[i][j]);
85 }
86 printf("\n");
87 }
88
89}
90void main()
91{
92 int n = 0;
93 int i = 0;
94 int j = 0;
95 int** rect;
96 printf("请输入一个奇数\n");
97 scanf("%d",&n);
98 //OK 成功读入了数据
99
100 //下面创建一个矩形
101 rect = (int **)malloc(sizeof(int *)*n);
102 for(i = 0;i<n;i++)
103 {
104 rect[i] = (int *)malloc(sizeof(int)*n);
105 }
106 //截止到此,已经成功动态创建了这个数组
107
108
109 //初始化函数
110 init(n,rect);
111 //运算的函数
112 pro(n,rect);
113 //下面是打印的函数
114 print(n,rect);
115
116
117
118
119
120}
以上就是整理的幻方问题的程序,希望各位指正!
posted on 2011-02-16 19:43
崔佳星 阅读(457)
评论(0) 编辑 收藏 引用 所属分类:
数据结构和算法