正文

幻方的几种构造方法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;} // 测试用例:输入:3590输出:8 1 63 5 74 9 2 17 24 1 8 1523 5 7 14 164 6 13 20 2210 12 19 21 311 18 25 2 9 47 58 69 80 1 12 23 34 4557 68 79 9 11 22 33 44 4667 78 8 10 21 32 43 54 5677 7 18 20 31 42 53 55 666 17 19 30 41 52 63 65 7616 27 29 40 51 62 64 75 526 28 39 50 61 72 74 4 1536 38 49 60 71 73 3 14 2537 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;} // 测试用例:输入:3590输出:4 9 23 5 78 1 6 11 18 25 2 910 12 19 21 34 6 13 20 2223 5 7 14 1617 24 1 8 15 37 48 59 70 81 2 13 24 3536 38 49 60 71 73 3 14 2526 28 39 50 61 72 74 4 1516 27 29 40 51 62 64 75 56 17 19 30 41 52 63 65 7677 7 18 20 31 42 53 55 6667 78 8 10 21 32 43 54 5657 68 79 9 11 22 33 44 4647 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;}// 测试用例:输入:3590输出:8 3 41 5 96 7 2 18 24 5 6 1222 3 9 15 161 7 13 19 2510 11 17 23 414 20 21 2 8 50 60 70 80 9 10 20 30 4058 68 78 7 17 27 28 38 4866 76 5 15 25 35 45 46 5674 3 13 23 33 43 53 63 641 11 21 31 41 51 61 71 8118 19 29 39 49 59 69 79 826 36 37 47 57 67 77 6 1634 44 54 55 65 75 4 14 2442 52 62 72 73 2 12 22 32 也许还有其它的构造方法,而且得到的幻方可能都不相同

阅读(2850) | 评论(0)


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

评论

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