posts - 21,  comments - 9,  trackbacks - 0
n阶幻方问题:设n为奇数(n[3, 19])。试在n´n的表格内不重复地填上1, 2, …, n2数字,使得横向、纵向、两对角线上数之和都相等。


  1#include<stdio.h>
  2#include<malloc.h>
  3//此程序适用于幻方问题
  4//奇数阶幻方问题
  5
  6
  7//初始化函数
  8void 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//计算函数
 22void 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//打印输出函数
 76void 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}

 90void 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 崔佳星 阅读(457) 评论(0)  编辑 收藏 引用 所属分类: 数据结构和算法

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


<2011年2月>
303112345
6789101112
13141516171819
20212223242526
272812345
6789101112

常用链接

留言簿(1)

随笔分类

随笔档案

文章分类

文章档案

搜索

  •  

最新评论

阅读排行榜

评论排行榜