正文

幻方的几种构造方法2007-06-15 16:45:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/lingdlz/26819.html

分享到:

幻方的要求:每一行,每一列,还有两条斜线上数字的和都相等.
(以下程序输入的 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

也许还有其它的构造方法,而且得到的幻方可能都不相同

阅读(2683) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册