标题:求奇数魔方阵找错
只看楼主
swehenry
Rank: 2
等 级:论坛游民
帖 子:45
专家分:14
注 册:2007-11-11
 问题点数:0 回复次数:4 
求奇数魔方阵找错
各位帮忙看看这个程序(求奇数魔方阵的)

#define N 7
#include<stdio.h>
void main()
{
  int a[N][N],i,j,k;
  for(i=0;i<N;i++)    /*先处理第一行*/
    for(j=0;j<N;j++)
    {
      a[i][j]=0;     /*先令所有元素都为0*/
    }
      j=(N-1)/2;     /*判断j的位置*/
      a[0][j]=1;    /*将1放在第一行中间一列*/
  for(k=2;k<=N*N;k++)    /*再从第二行开始处理*/
    {
      i=i-1;    /*存放的行比前一个数的行数减1*/
      j=j+1;    /*存放的列比前一个数的列数加1*/
      if((i<0)&&(j==N))    /*前一个数是第一行第N列时,把下一个数放在上一个数的下面*/
      {
        i=i+2;
        j=j-1;
      }
      else
      {
        if(i<1)    /*当行数减到第一行,返回到最后一行*/
        i=N-1;
        if(j>N-1)    /*当列数加到最后一行,返回到第一行*/
        j=0;
      }
      if(a[i][j]==0)     /*如果该元素为0,继续执行程序*/
        a[i][j]=k;
      else     /*如果该元素不为0,就说明要填的数的位置已经被占,则该数放在上一个数的下面*/
      {
        i=i+2;
        j=j-1;
        a[i][j]=k;
      }
    }
    for(i=0;i<=N;i++)    /*输出数组*/
    {
      for(j=0;j<N;j++)
      printf("%5d",a[i][j]);
      printf("\n\n");
    }
  }

运行后的结果是:
0    0    0    1    0    0    0
19   13   7    43   37   31   25
12   6    42   36   30   24   18
5    41   35   29   23   17   11
40   34   28   22   16   10   4
33   27   21   15   9    3    39
26   20   14    8    2   38   32
12450884199593    198994889899608    47    49

我不知道第一行为何会那样,还有最后一串数字是怎么回事?
(在vc里编译和链接都没有错)
搜索更多相关主题的帖子: 魔方 奇数 
2008-03-19 13:36
qfyzy
Rank: 2
等 级:论坛游民
威 望:1
帖 子:380
专家分:86
注 册:2008-2-17
得分:0 
源程序想得太简单了,有的复杂情况没考虑。我简化了一下。只是注释我基本没改,就不要看了
#define N 7
#include<stdio.h>
void main()
{
    int a[N][N]={0},i=0,j,k;
      j=(N-1)/2;
      i=0;
  for(k=1;k<=N*N;)    /*开始处理*/
    {
      if((i<0)&&(j==N))    /*前一个数是第一行第N列时,把下一个数放在上一个数的下面*/
      {
        i=i+2;
        j=j-1;
      }
      else  if(i<0)    /*当行数减到第一行,返回到最后一行*/
       i=N-1;
      else  if(j>N-1)    /*当列数加到最后一行,返回到第一行*/
        j=0;
      else  if(!a[i][j]){     /*如果该元素为0,继续执行程序*/
        a[i][j]=k++;         
        i=i-1;
        j=j+1;
      }
      else     /*如果该元素不为0,就说明要填的数的位置已经被占,则该数放在上一个数的下面*/
      {
        i=i+2;
        j=j-1;
      }
    }
    for(i=0;i<N;i++)    /*输出数组*/
    {
      for(j=0;j<N;j++)
      printf("%5d",a[i][j]);
      printf("\n\n");
    }
  }

[[it] 本帖最后由 qfyzy 于 2008-3-19 20:06 编辑 [/it]]

当对C的经验增加时,它会显的很好用.----Dennis M Ritche如是说
2008-03-19 15:23
swehenry
Rank: 2
等 级:论坛游民
帖 子:45
专家分:14
注 册:2007-11-11
得分:0 
感谢2楼啊,还真可以执行,因为是初学,好多东西都不熟悉,这个程序我想了两天了,终于看到正确结果了哈!再次感谢!!!

(我还是想知道我的源程序哪里错了)

[[it] 本帖最后由 swehenry 于 2008-3-19 20:01 编辑 [/it]]
2008-03-19 19:58
qfyzy
Rank: 2
等 级:论坛游民
威 望:1
帖 子:380
专家分:86
注 册:2008-2-17
得分:0 
你把我的程序和你的对比下,
我基本按你的思路改的.
你可以按你的程序人工执行下,就知道什么地方考虑不周了

当对C的经验增加时,它会显的很好用.----Dennis M Ritche如是说
2008-03-19 20:06
swehenry
Rank: 2
等 级:论坛游民
帖 子:45
专家分:14
注 册:2007-11-11
得分:0 
呵呵,看出来了,原来在定义返回的时候我是令i<1,这样实际是在开始摆放第一行的时候就执行了,修改成i<0就可以了,还有就是“for(k=2;k<=N*N;k++)”这一句要令k=2才可以得到正确的结果,另外之前出现乱码是因为最后输出时出现的问题,原来是for(i=0;i<=N;i++) ,这样i就多了一行,改成for(i=0;i<N;i++) 就没乱码了。看来以后做c确实要很严谨才行啊!

[[it] 本帖最后由 swehenry 于 2008-3-19 20:58 编辑 [/it]]
2008-03-19 20:37



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




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

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