n阶幻方问题:设n为奇数(n∈[3, 19])。试在n´n的表格内不重复地填上1, 2, …, n2数字,使得横向、纵向、两对角线上数之和都相等。
1
#include<stdio.h>
2
#include<malloc.h>
3
//此程序适用于幻方问题
4
//奇数阶幻方问题
5
6
7
//初始化函数
8
void 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
//计算函数
22
void 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
//打印输出函数
76
void 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
}
90
void 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
崔佳星 阅读(465)
评论(0) 编辑 收藏 引用 所属分类:
数据结构和算法