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
崔佳星 閱讀(472)
評論(0) 編輯 收藏 引用 所屬分類:
數據結構和算法