回 帖 发 新 帖 刷新版面

主题:[原创]奇数魔方

把整数1到n填入n行n列的方阵,使n行n列的方阵每行每列每对角线相等,我想了半天也想不出来……大家教教我
[em8][em8]

输入
3
输出
6  1  8
7  5  3
2  9  4

回复列表 (共8个回复)

沙发


#include<iostream.h>
#include<iomanip.h>
void PrintMagicTable(int **a,int n);
void main()
{
    int num,i,j;
    cout<<"please input the number:  ";
    cin>>num;
    while(0==num%2)
    {
        cout<<"error input,please input again: ";
        cin>>num;
    }
    int **a=new int *[num];
    for(i=0;i<num;i++)
        a[i]=new int[num];
    for(i=0;i<num;i++)
        for(j=0;j<num;j++)
            a[i][j]=0;
    PrintMagicTable(a,num);
    delete []a;
}
void PrintMagicTable(int **a,int n)
{
    int r,c,number;
    c=n/2;
    r=0;
    a[r][c]=1;
    for(number=2;number<=n*n;number++)
    {
        r=r-1;
        c=c+1;
        if((r<0)&&(c>n-1))
        {
            r=r+2;
            c=c-1;
        }
        else
        {
            if(r<0)
                r=n-1;
            if(c>n-1)
                c=0;
        }
        if(0==a[r][c])
            a[r][c]=number;
        else
        {
            r=r+2;
            c=c-1;
            a[r][c]=number;
        }
    }
   for(r=0;r<n;r++)
   {
       for(c=0;c<n;c++)
           cout<<setw(5)<<a[r][c];
       cout<<endl<<endl;
   }
}
只适合奇数; [em9][em9][em9]

板凳

这是c++的程序
怎么直接贴pascal来了?

3 楼

奇阶幻方填数法:从任意位置填1(个别位置可能造成幻方不存在),然后向右上递增填数,上越界就回到最下面,右越界就回到最左面。如果下一个数的位置已经被占用那么把数填到当前数字的正下方
很简单的,自己实现吧
我们当初集训的时候还简单实现过偶阶幻方来的

4 楼


不好意思,看错了

SORRY!!!!!!!!

5 楼

偶数幻方似乎编程不能实现
及时要实现,代码也很复杂

6 楼

可以实现
只是很复杂
我初中的时候写过
只是忘光了
是分块换数的

7 楼

我作了一个任意阶的,是用foxpro作的:
http://bbs.pfan.cn/post-33275.html

8 楼

每行的和 每列的和 每对角线的和都相等,和可以计算出来:
n阶每行和:n*(1+n*n)/2,最后再凑出来就OK了

我来回复

您尚未登录,请登录后再回复。点此登录或注册