幻方的要求:每一行,每一列,还有两条斜线上数字的和都相等.
(以下程序输入的 n 要求 n<30 并且 n 为奇数,输入0 结束)
构造 1 :
#include <stdio.h>
#include <string.h>
void out(int n){
int i,j,k,a[32][32];
memset(a,0,sizeof(int)*32*32);
j=n/2+1;
a[1][j]=1;
for(k=2;k <= n*n; k ++){
i=i-1;
j=j+1;
if((i<1)&&(j>n)){
i=i+2;
j=j-1;
}
else{
if(i<1)
i=n;
if(j>n)
j=1;
}
if(a[i][j]==0)
a[i][j]=k;
else{
i=i+2;
j=j-1;
a[i][j]=k;
}
}
for(i=1;i<=n;i++){
for(j=1;j<=n;j++)
printf("%d ",a[i][j]);
printf("\n");
}
}
int main(){
int n;
while( scanf("%d",&n) != EOF ){
if(n == 0)
break;
out( n );
printf("\n");
}
return 0;
}
// 测试用例:
输入:
3
5
9
0
输出:
8 1 6
3 5 7
4 9 2
17 24 1 8 15
23 5 7 14 16
4 6 13 20 22
10 12 19 21 3
11 18 25 2 9
47 58 69 80 1 12 23 34 45
57 68 79 9 11 22 33 44 46
67 78 8 10 21 32 43 54 56
77 7 18 20 31 42 53 55 66
6 17 19 30 41 52 63 65 76
16 27 29 40 51 62 64 75 5
26 28 39 50 61 72 74 4 15
36 38 49 60 71 73 3 14 25
37 48 59 70 81 2 13 24 35
构造2:
#include <stdio.h>
#include <string.h>
void out(int n){
int i,j,k,a[32][32];
memset(a,0,sizeof(int)*32*32);
j=n/2+1;
a[n][j]=1;
for(i=n,k=2;k <= n*n; k++){
i++;
j++;
if(i>n && j>n){
i-=2;
j--;
}
else{
if(i>n)
i=1;
else if(j>n)
j=1;
}
if(a[i][j]==0)
a[i][j]=k;
else{
i-=2;
j--;
a[i][j]=k;
}
}
for(i=1;i<=n;i++){
for(j=1;j<=n;j++)
printf("%d ",a[i][j]);
printf("\n");
}
}
int main(){
int n;
while( scanf("%d",&n) != EOF ){
if(n == 0)
break;
out( n );
printf("\n");
}
return 0;
}
// 测试用例:
输入:
3
5
9
0
输出:
4 9 2
3 5 7
8 1 6
11 18 25 2 9
10 12 19 21 3
4 6 13 20 22
23 5 7 14 16
17 24 1 8 15
37 48 59 70 81 2 13 24 35
36 38 49 60 71 73 3 14 25
26 28 39 50 61 72 74 4 15
16 27 29 40 51 62 64 75 5
6 17 19 30 41 52 63 65 76
77 7 18 20 31 42 53 55 66
67 78 8 10 21 32 43 54 56
57 68 79 9 11 22 33 44 46
47 58 69 80 1 12 23 34 45
构造3:
#include<stdio.h>
int main()
{
int t,i,j;
while(1){
scanf("%d",&t);
if(t==0)
break;
for(i=1;i<=t;i++)
for(j=1;j<=t;j++){
printf("%d ",((j+i+(t-3)/2) % t)*t+(j-i+(3*t-1)/2) % t +1);
if(j==t)
printf("\n");
}
printf("\n");
}
return 0;
}
// 测试用例:
输入:
3
5
9
0
输出:
8 3 4
1 5 9
6 7 2
18 24 5 6 12
22 3 9 15 16
1 7 13 19 25
10 11 17 23 4
14 20 21 2 8
50 60 70 80 9 10 20 30 40
58 68 78 7 17 27 28 38 48
66 76 5 15 25 35 45 46 56
74 3 13 23 33 43 53 63 64
1 11 21 31 41 51 61 71 81
18 19 29 39 49 59 69 79 8
26 36 37 47 57 67 77 6 16
34 44 54 55 65 75 4 14 24
42 52 62 72 73 2 12 22 32
也许还有其它的构造方法,而且得到的幻方可能都不相同
评论