标题:求"魔方阵"程序及算法
只看楼主
himpo
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:192
专家分:123
注 册:2008-5-16
结帖率:100%
 问题点数:0 回复次数:10 
求"魔方阵"程序及算法
刚学了数组,有道习题要求打印1-n^2构成的魔方阵!
如三阶魔方阵:8     1      6
                        3      5     7
                        4      9     2
我找不到他的规律!
一气之下,做了个无穷的4阶的!算很长时间!

但我想知道一个关于n阶的通用程序,要求打印出由
1-n^2构成的 所有的  魔方阵!
有人能帮帮忙么?

4阶的这个我做的!
a  b  c d
e  f  g  h
i   j   k  l
m  n  o  p
程序如下:
main()
{
 int a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p;
 int num=0;                             /* 计算4阶魔方阵有多少种 */
 for(a=1;a<=16;a++)
    for(b=1;b<=16;b++)
       {
    if (b==a) continue;   /* 当取值与a相同跳出本次循环 */
    for(c=1;c<=16;c++)
       {
        if ((c==a)||(c==b)) continue;
        d=34-a-b-c;
        if ((d==a)||(d==b)||(d==c)||d<1||d>16) continue;
        for(e=1;e<=16;e++)
           {
        if ((e==a)||(e==b)||(e==c)||(e==d)) continue;
        for(f=1;f<=16;f++)
           {
            if ((f==a)||(f==b)||(f==c)||(f==d)||(f==e)) continue;
            for(g=1;g<=16;g++)
               {
            if ((g==a)||(g==b)||(g==c)||(g==d)||(g==e)||(g==f)) continue;
            h=34-e-f-g;
            if ((h==a)||(h==b)||(h==c)||(h==d)||(h==e)||(h==f)
                ||(h==g)||h<1||h>16) continue;
            for(i=1;i<=16;i++)
               {
                if ((i==a)||(i==b)||(i==c)||(i==d)||(i==e)
                   ||(i==f)||(i==g)||(i==h)) continue;
                for(j=1;j<=16;j++)
                  {
                   if ((j==a)||(j==b)||(j==c)||(j==d)||(j==e)
                 ||(j==f)||(j==g)||(j==h)||(j==i)) continue;
                   for(k=1;k<=16;k++)
                 {
                  if ((k==a)||(k==b)||(k==c)||(k==d)||(k==e)
                    ||(k==f)||(k==g)||(k==h)||(k==i)||(k==j)) continue;
                  l=34-i-j-k;
                  if ((l==a)||(l==b)||(l==c)||(l==d)||(l==e)
                    ||(l==f)||(l==g)||(l==h)||(l==i)||(l==j)
                    ||(l==k)||l<1||l>16) continue;
                  m=34-a-e-i;
                  if ((m==a)||(m==b)||(m==c)||(m==d)||(m==e)
                    ||(m==f)||(m==g)||(m==h)||(m==i)||(m==j)
                    ||(m==k)||(m==l)||m<1||m>16) continue;
                  n=34-b-f-j;
                  if ((n==a)||(n==b)||(n==c)||(n==d)||(n==e)
                    ||(n==f)||(n==g)||(n==h)||(n==i)||(n==j)
                    ||(n==k)||(n==l)||(n==m)||m<1||m>16) continue;
                  o=34-c-g-k;
                  if ((o==a)||(o==b)||(o==c)||(o==d)||(o==e)
                    ||(o==f)||(o==g)||(o==h)||(o==i)||(o==j)
                    ||(o==k)||(o==l)||(o==m)||(o==n)||o<1
                    ||o>16) continue;
                  p=34-d-h-l;
                  if ((p==a)||(p==b)||(p==c)||(p==d)||(p==e)
                    ||(p==f)||(p==g)||(p==h)||(p==i)||(p==j)
                    ||(p==k)||(p==l)||(p==m)||(p==n)||(p==o)
                    ||p<1||p>16) continue;
                  if ((m+n+o+p)!=34) continue;
                  if ((a+f+k+p)!=34) continue;
                  if ((d+g+j+m)!=34) continue;
printf("%2d,%2d,%2d,%2d\n",a,b,c,d);
printf("%2d,%2d,%2d,%2d\n",e,f,g,h);
printf("%2d,%2d,%2d,%2d\n",i,j,k,l);
printf("%2d,%2d,%2d,%2d\n",m,n,o,p);
num++;}}}}}}}}
printf("总共有%d种排序方法!!!\n",num);
printf("\n");
}
搜索更多相关主题的帖子: 魔方 算法 int 
2008-05-25 10:35
雨中飛燕
Rank: 1
等 级:新手上路
帖 子:765
专家分:0
注 册:2007-10-13
得分:0 
厉害厉害。。。。。。。。

[color=white]
2008-05-25 11:01
himpo
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:192
专家分:123
注 册:2008-5-16
得分:0 
我刚学C的,我知道我的方法笨,
各位高手能给我个思路和别的算法么?
2008-05-25 11:11
雨中飛燕
Rank: 1
等 级:新手上路
帖 子:765
专家分:0
注 册:2007-10-13
得分:0 
你学了数组没有??

[color=white]
2008-05-25 12:46
himpo
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:192
专家分:123
注 册:2008-5-16
得分:0 
学了,但是用数组没有思路!
总不会要我把上面的a换成a[0][0],b换成a[0][1]什么的吧!
我这个思路方式用数组名写起来麻烦!
2008-05-25 13:15
zhuwei168
Rank: 1
来 自:东软信息学院
等 级:新手上路
帖 子:180
专家分:0
注 册:2008-2-13
得分:0 
.....
我算是服了楼主的耐心了,
能坚持写这么长的代码

做一个自由的人,飞到蔚蓝的天空里。
2008-05-25 13:18
雨中飛燕
Rank: 1
等 级:新手上路
帖 子:765
专家分:0
注 册:2007-10-13
得分:0 
5阶的你怎么写,6阶呢?你需要这样来写代码?

[color=white]
2008-05-25 13:26
himpo
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:192
专家分:123
注 册:2008-5-16
得分:0 
所以我知道我的思路有问题!
我也会用数组表示!
但我不知道如何让a[N][N]数组中的每一个数组元素都有机会取遍1-N^2中的每一个值
而且各个数组元素的值不重复。
这一段程序我不会。

我想别的算法就不需要这么穷举了吧。
2008-05-25 13:43
FancyMouse
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2008-5-15
得分:0 
单解的话有构造法。全解……硬暴吧
2008-05-25 19:09
moonwalker
Rank: 1
等 级:新手上路
威 望:1
帖 子:909
专家分:2
注 册:2007-3-2
得分:0 
我初学时写过一个,这个是奇数阶的解法,偶数阶当时没想出来,后面也没再想过。
算法可以去网上找,用行矩阵和列矩阵解的,我就不赘述了。代码如下:
#include "stdio.h"
#define N 7
main()
{
    int col[N][N],row[N][N];
    int i,j;
    /*求行矩阵*/
    for(i=0;i<N;i++)
    {
        for(j=0;j<N;j++)
        {
            col[i][j]=(-1)*i+j+(N+1)/2;
            if(col[i][j]>N)
            col[i][j]-=N;
            if(col[i][j]<1)
            col[i][j]+=N;
        }
    }
    /*求列矩阵*/
    for(i=0;i<N;i++)
    {
        for(j=0;j<N;j++)
        {
            row[i][j]=col[i][N-j-1];
        }
    }
    /*由行矩阵、列矩阵和自然矩阵计算魔方阵*/
    for(i=0;i<N;i++)
    {
        for(j=0;j<N;j++)
        {
            printf("%5d",(col[i][j]-1)*N+row[i][j]);
        }
        printf("\n");
    }
}

“视频教程网”免费提供教学资源
C不限制你的自由!
条件是自己承担滥用自由的恶果!
2008-05-25 19:47



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-215815-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.265387 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved