鱼C论坛

 找回密码
 立即注册
查看: 2742|回复: 14

魔方阵问题。。

[复制链接]
发表于 2012-6-22 22:13:15 | 显示全部楼层 |阅读模式
18鱼币
#include<stdio.h>
int main()
{
int a[15][15],i,j,k,p,n;
p=1;
while(p==1)
{  printf("n(n=1--15):");
scanf("%d",&n);
if((n!=0) && (n<=15) && (n%2!=0))
  p=0;
}
for(i=1;i<=n;i++)
  for(j=1;j<=n;j++)
   a[i][j]=0;       //初始化
  j=n/2+1;
  a[1][j]=1;            // 把1的位置定下来
  for(k=2;k<=n*n;k++)
  {
     i=i-1;                     //什么意思
  j=j+1;                     //什么意思
if((i<1) && (j>n))     //什么意思
  {
   i=i+2;                           //什么意思
      j=j-1;
  }            
  else                         //什么意思
  {
   if(i<1) i=n;                     //什么意思
   if(j>n) j=1;
  }
  if(a[i][j]==0)                   //什么意思
   a[i][j]=k;
  else                                  //什么意思
  {
   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");
  }
}
后面的步骤 我是一个看不明白,希望来个人能和我详细说说
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-6-22 22:13:16 | 显示全部楼层
  1. #include<stdio.h>
  2. int main()
  3. {
  4. int a[15][15],i,j,k,p,n;
  5. p=1;
  6. while(p==1)
  7. {  printf("n(n=1--15):");
  8. scanf("%d",&n);
  9. if((n!=0) && (n<=15) && (n%2!=0))
  10.   p=0;
  11. }
  12. for(i=1;i<=n;i++)
  13.   for(j=1;j<=n;j++)
  14.    a[i][j]=0;       //初始化
  15.   j=n/2+1;
  16.   a[1][j]=1;            // 把1的位置定下来
  17.   
  18.   for(k=2;k<=n*n;k++)
  19.   {
  20.         i=i-1;  j=j+1;  //确定下一个位置,即右上角位置
  21.          
  22.         if((i<1) && (j>n))     //判断是不是最右上角的位置
  23.         {
  24.                 i=i+2;                           //最右上角的下面
  25.                 j=j-1;
  26.         }            
  27.         else                        
  28.         {
  29.         if(i<1) i=n;                    
  30.         if(j>n) j=1;//判断是不是 超出矩阵范围并调整
  31.         }
  32.        
  33.         if(a[i][j]==0)                   //判断这个位置是不是 放数字了
  34.         a[i][j]=k;
  35.         else                                 
  36.         {
  37.                 i=i+2;j=j-1;                          //如果放了,则放到原来位置的下面
  38.                 a[i][j]=k;
  39.         }
  40.         }
  41.         for(i=1;i<=n;i++)
  42.         {  for(j=1;j<=n;j++)
  43.         printf("%5d",a[i][j]);
  44.         printf("\n");
  45. }
  46.   }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-6-22 22:22:16 | 显示全部楼层
魔方排列是有规律的,n-1确定后,n就在n-1的右上方,如果右上方有数了,就在下方,如果右边超出范围,就移到左边,其他三个方向同样的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-6-22 22:27:00 | 显示全部楼层

我勒个去 ,我也知道啊 ,但是看不那个白步骤。。。比如说如果按上面的规则确定的位置上已有数,或上一个数是第一行第n列时,则把下一个数放在上一个数的下面。,后面怎么会是i=i+2,j=j-1...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-6-22 22:34:45 | 显示全部楼层
else                         //什么意思
  {
   if(i<1) i=n;                     //什么意思
   if(j>n) j=1;
这是不是 如果上一个数的行数为1,则下一个数的行数为n,列数加1。如果上一个数的列数的n时,下一个数的列数为1,行数减1。if(j>n) 是不是 列数为N是 下一个数 列数为1.。但是怎么可能是j>n呢  J=N的话 不是 一直都不会是>n啊 应该是J=N吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-6-22 22:41:33 | 显示全部楼层
猪八哥 发表于 2012-6-22 22:34
else                         //什么意思
  {
   if(in) j=1;

前面不是有加一 减一吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-6-22 22:43:24 | 显示全部楼层
wangyexin 发表于 2012-6-22 22:41
前面不是有加一 减一吗

我已经晕了。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-6-22 22:44:05 | 显示全部楼层
wangyexin 发表于 2012-6-22 22:41
前面不是有加一 减一吗

前面不是 下个数的位置吗》我问的是果上一个数的行数为1,则下一个数的行数为n,列数加1。如果上一个数的列数的n时,下一个数的列数为1,行数减1。if(j>n) 是不是 列数为N是 下一个数 列数为1.。但是怎么可能是j>n呢  J=N的话 不是 一直都不会是>n啊 应该是J=N吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-6-22 22:45:51 | 显示全部楼层
  if(i<1) i=n;                       if(j>n) j=1;
好吧 你先告诉我 这2个是什么意思
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-6-22 22:49:58 | 显示全部楼层
if((i<1) && (j>n))     //什么意思
  {
   i=i+2;                           //什么意思
      j=j-1;
  }            
这个是不是 超出了行和列 然后就那啥了,但是为什么超出后 就是i=i+2 j=j-1呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-6-22 22:51:51 | 显示全部楼层

还是不明白。。。。。再写详细点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-6-22 22:55:29 | 显示全部楼层
猪八哥 发表于 2012-6-22 22:49
if((in))     //什么意思
  {
   i=i+2;                           //什么意思

因为先前减一 加一了,还原是i+1,j-1 然后还要变为下面那个位置,所以i还要加一 最后就是i=i+2.j=j-1;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-6-22 22:57:14 | 显示全部楼层
wangyexin 发表于 2012-6-22 22:55
因为先前减一 加一了,还原是i+1,j-1 然后还要变为下面那个位置,所以i还要加一 最后就是i=i+2.j=j-1;

。。。晕了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-6-22 22:58:00 | 显示全部楼层

明天想吧 今天不明白了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-6-23 08:33:23 | 显示全部楼层
猪八哥 发表于 2012-6-22 22:58
明天想吧 今天不明白了

在纸上把算法走一遍,也许就明白了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-25 21:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表