| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 886 人关注过本帖
标题:帮我改改这个程序(打印魔方阵)
只看楼主 加入收藏
feng00055
Rank: 2
等 级:论坛游民
帖 子:56
专家分:27
注 册:2009-8-26
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:5 
帮我改改这个程序(打印魔方阵)
main()
{
int i,j,n,k,a[100][100];
printf("Please input n(odd,3~99):\n");
scanf("%d",&n);
for(i=1,j=(n+1)/2,k=1;k<=n*n;i--,j++,k++)
{
if(i==0 && j==n+1)
{i=2;j=n;}
if(i==0) i=n;
if(j==n+1) j=1;
if(a[i][j]!=0)
{i=i+2;j=j-1;}
a[i][j]=k;
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
printf("%5d",a[i][j]);
printf("\n\n");
}
}
搜索更多相关主题的帖子: feng00055 
2009-08-26 21:06
becarefulsen
Rank: 2
等 级:论坛游民
帖 子:1
专家分:10
注 册:2009-8-25
收藏
得分:10 
无知地问问。。。什么是魔方阵??
2009-08-26 21:57
feng00055
Rank: 2
等 级:论坛游民
帖 子:56
专家分:27
注 册:2009-8-26
收藏
得分:0 
魔方阵简介
魔方阵,古代又称“纵横图”,是指组成元素为自然数1、2…n的平方的n×n的方阵,其中每个元素值都不相等,且每行、每列以及主、副对角线上各n个元素之和都相等。  如3×3的魔方阵:   8 1 6   3 5 7   4 9 2   魔方阵的排列规律如下:  (1)将1放在第一行中间一列;  (2)从2开始直到n×n止各数依次按下列规则存放;每一个数存放的行比前一个数的行数减1,列数加1(例如上面的三阶魔方阵,5在4的上一行后一列);  (3)如果上一个数的行数为1,则下一个数的行数为n(指最下一行);例如1在第一行,则2应放在最下一行,列数同样加1;  (4)当上一个数的列数为n时,下一个数的列数应为1,行数减去1。例如2在第3行最后一列,则3应放在第二行第一列;  (5)如果按上面规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。例如按上面的规定,4应该放在第1行第2列,但该位置已经被占据,所以4就放在3的下面;
2009-08-27 08:02
UserYuH
Rank: 12Rank: 12Rank: 12
来 自:毅华
等 级:火箭侠
威 望:8
帖 子:720
专家分:3300
注 册:2009-8-10
收藏
得分:10 
之前有玩过类似这的游戏,但不知道有这么一规则,还能推算的,挺有意思。
你的程序少了些判断,你知道规则,想法也是正确的,就是可能发生错误没想到位。
有意思的东东就来编一下,改了很多,看一下是不是这样子:
# include <stdio.h>
main()
{
int i,j,n,k,a[100][100]={0};   /*把a数组所以元素初始0*/
while(1)                    /*如输入值”小于3或大于99或初2余数为0“的数继续循环输入*/
 {
  printf("Please input n(odd,3~99):\n");
  scanf("%d",&n);
  if(n<3||n>99||n%2==0)
   {
    printf("error!\n");
   }
  else
    break;
 }
for(i=0,j=n/2,k=1;k<=n*n;k++) /*循环n乘n次断,i和j作下标,k作要放的数值*/
 {
  if(a[i][j]==0)         /*判断要放的a[i][j]位置是否为0,0代表可放入k值,非0代表不可放入k值*/
    {
     a[i][j]=k;     /*放入k值*/
    }
  else           /*要放的a[i][j]位置不为0时,反回之前存放的位置*/
    {
     if(i==n-1)    /*这里判断如i是最后一行时,让i跑回第一行*/
       i=0;
     else
       i++;      /*之前i是减1行,现在反回去i就加1*/
     if(j==0)    /*判断如j是第一列时,让j反回最后一列*/
       j=n-1;
     else
       j--;   /*之前j是加1列,现在反回去j就减1*/
     if(i==n-1)
       i=-1;
     i++;       /*把要存k值的位置往下移一行*/
     a[i][j]=k;  /*放入k值*/
    }
  if(i==0)        /*-------------*/
    i=n-1;        /*这里是放入k值后,如i是第一行,让i走到最后一行*/
  else
    i--;
  if(j==n-1)      /*横线之间这一段代码是按魔方阵的规则移动下标*/
    j=0;         /*这里是放入k值后,如j是最后一列,让j走到第一列*/
  else
    j++;         /*-------------*/
 }
for(i=0;i<n;i++)       /*输出魔方阵*/
  {
   for(j=0;j<n;j++)
     {
      printf("%5d",a[i][j]);
     }
   printf("\n\n");
  }
 getchar();
 getchar();
}

[ 本帖最后由 UserYuH 于 2009-8-27 16:59 编辑 ]

努力—前进—变老—退休—入土
2009-08-27 13:32
feng00055
Rank: 2
等 级:论坛游民
帖 子:56
专家分:27
注 册:2009-8-26
收藏
得分:0 

大侠不愧为大侠!
我学到了两点:
1 数组初始化后未赋值的项才为0
2 最后加上两个getchar()后自动出值,没在教材上看到过,学习了!
非常感谢教会了我这些,让我今后少走弯路!
我的那个原程序只要补上以上两点就可以完美得运行了,如下:
#include <stdio.h>
main()
{
int i,j,n,k,a[100][100]={0};
printf("Please input n(odd,3~99):\n");
scanf("%d",&n);
for(i=1,j=(n+1)/2,k=1;k<=n*n;i--,j++,k++)
{
if(i==0 && j==n+1)
{i=2;j=n;}
if(i==0) i=n;
if(j==n+1) j=1;
if(a[i][j]!=0)
{i=i+2;j=j-1;}
a[i][j]=k;
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
printf("%5d",a[i][j]);
printf("\n\n");
}
getchar();
getchar();
}
2009-08-27 19:18
qijj
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2009-10-14
收藏
得分:0 
寻找打印魔方高手共同发财
有空联系我28140900@
2009-10-14 16:58
快速回复:帮我改改这个程序(打印魔方阵)
数据加载中...
 
   



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

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