| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 512 人关注过本帖
标题:大家帮我看看魔方阵问题错在哪了
只看楼主 加入收藏
王叫兽Joe
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2014-5-23
结帖率:33.33%
收藏
 问题点数:0 回复次数:7 
大家帮我看看魔方阵问题错在哪了
#include<stdio.h>
#include<stdlib.h>
#define ERROR 0
#define OK 1
int main()
{
    int m;
    scanf("%d",m);
    if(m%2==0||m==1) return ERROR;
    else return OK;
        int a[m][m],i,j,k;
        for(i=0;i<m;i++)
        for(j=0;j<m;j++)
        {
            a[i][j]=0;
        }               /*令所有元素都为0*/
        j=(m-1)/2;
        a[0][j]=1;    /*令第一行中间一列元素为1*/
        for(k=2;k<=m*m;k++)
        {
           if((i-1+m)%m!=0)
              {
                  i=(i-1+m)%m;
                  if((j-1+m)%m!=0)
                  j=(j-1+m)%m;
             }
           if (a[i][j]!=0)
           {
                i=(i+2)%m;
                j=(j+1)%m;
           }
           a[i][j]=k;
        }
        for(i=0;i<m;i++)    /*输出数组*/
        {
            for(j=0;j<m;j++)
            printf("%5d",a[i][j]);
            printf("\n\n");
        }
}
搜索更多相关主题的帖子: include return 元素 
2014-06-05 21:53
王叫兽Joe
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2014-5-23
收藏
得分:0 
我把主要的思想写一下,希望有大神能帮帮忙
    由1开始填数,将1放在第0行的中间位置。
    将魔方阵想象成上下、左右相接,每次往左上角走一步,会有下列情况:
    左上角超出上方边界,则在最下边相对应的位置填入下一个数字;
    左上角超出左边边界,则在最右边相应的位置填入下一个数字;
    如果按上述方法找到的位置已填入数据,则在同一列下一行填入下一个数字。

由三阶魔方阵的生成过程可知,某一位置(x,y)的左上角的位置是(x-1,y-1),如果x-1≥0,不用调整,否则将其调整为x-1+m;同理,如果y-1≥0,不用调整,否则将其调整为y-1+m。所以,位置(x,y)的左上角的位置可以用求模的方法获得,即:
x=(x-1+m)%m
y=(y-1+m)%m
如果所求的位置已经有数据了,将该数据填入同一列下一行的位置。这里需要注意的是。此时的x和y已经变成之前的上一行上一列了,如果想变回之前位置的下一行同一列,x需要跨越两行,y需要跨越一列,即:
x=(x+2)%m
y=(y+1)%m
2014-06-06 09:33
TAAAAB
Rank: 7Rank: 7Rank: 7
来 自:湖南
等 级:黑侠
威 望:1
帖 子:243
专家分:635
注 册:2011-5-29
收藏
得分:0 
1,scanf("%d",m); 没有取地址符。
2,int a[m][m],i,j,k; 编译时M未知,无法通过。

修改上面二个地方之后能通过编译。
请楼主想下return 的问题,当main函数运行的return语句时,程序是否还是执行下面语句?

解决以上问题后就要想解题思路的问题了,根本上就错了,最起码第二次数的位置 不是i - 1; j - 1;  应该是i - 1;j + 1;
我的思路是
1,将第一行中间位置为1,
2,i - 1; j + 1; 得到下一个数的位置。
3,判断下一个数的位置是否合法。
     总共四种不同非法情况
        a) i < 0 ; j  == m  同时成立,说明上一个数在第一行,最后一列。i = i + 2; j = j - 1;
        b)i < 0  成立,说明上一个数在第一行任意列。i = m - 1;
        c) j == m  成立,说明上一个数在任意行,最后一列。j = 0;
        d) a[i][j] != 0 成立,说明当前位置有数。i = i + 2; j = j - 1;

人有多懒,编程就有多难。
2014-06-06 14:44
王叫兽Joe
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2014-5-23
收藏
得分:0 
回复 3 楼 TAAAAB
你的方法是依次往右上找元素,我的方法是左上找元素,原题的要求就是如此
2014-06-06 15:56
TAAAAB
Rank: 7Rank: 7Rank: 7
来 自:湖南
等 级:黑侠
威 望:1
帖 子:243
专家分:635
注 册:2011-5-29
收藏
得分:0 
回复 4 楼 王叫兽 Joe
左上和右上是一回事吧,会了右上左上也就没问题了

人有多懒,编程就有多难。
2014-06-06 16:56
TAAAAB
Rank: 7Rank: 7Rank: 7
来 自:湖南
等 级:黑侠
威 望:1
帖 子:243
专家分:635
注 册:2011-5-29
收藏
得分:0 
回复 4 楼 王叫兽 Joe
一个星期前我也在想魔方阵这个问题
我不懂为什么总要取余 x=(x-1+m)%m  是什么意思

人有多懒,编程就有多难。
2014-06-06 16:59
TAAAAB
Rank: 7Rank: 7Rank: 7
来 自:湖南
等 级:黑侠
威 望:1
帖 子:243
专家分:635
注 册:2011-5-29
收藏
得分:0 
试了一下左上没问题

程序代码:
#define N 7
#include<stdio.h>
void main()
{
    int a[N][N]={0};
    int i,j,k;

    i = 7;
    j = (N - 1) / 2;    
    a[0][j] = 1;    //将1放在第一行中间一列
  for(k = 2; k <= N * N; k++)    
    {
      i = i - 1;    //存放的行比前一个数的行数减1
      j = j - 1;    //存放的列比前一个数的列数减1
      if((i < 0) && (j < 0))   //前一个数是第一行第一列时,把下一个数放在上一个数的下面
      {
        i=i+2;
        j=j+1;
      }
      else
      {
        if(i<0)    //当行数减到第一行,返回到最后一行
        i=N-1;
        if(j<0)   //当行数减到第一行,返回到最后一行
        j=N-1;
      }
      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");
    }
  }

/*
VC6.0下运行结果:
--------------------------------------------
   28   19   10    1   48   39   30

   29   27   18    9    7   47   38

   37   35   26   17    8    6   46

   45   36   34   25   16   14    5

    4   44   42   33   24   15   13

   12    3   43   41   32   23   21

   20   11    2   49   40   31   22

Press any key to continue

--------------------------------------------
*/

人有多懒,编程就有多难。
2014-06-06 17:43
王叫兽Joe
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2014-5-23
收藏
得分:0 
回复 6 楼 TAAAAB
移动之后i-1如果>=0,没有问题,如果小于0,就需要调整位置为i-1+m,所以直接用求余包含了两种情况
2014-06-06 18:28
快速回复:大家帮我看看魔方阵问题错在哪了
数据加载中...
 
   



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

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