首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

魔方阵 谭浩强,该如何解决

2012-03-28 
魔方阵 谭浩强# include stdio.hvoid main(){int a[16][16],i,j,k,p,np1while(p1){printf(enter n

魔方阵 谭浩强
# include <stdio.h>
void main()
{int a[16][16],i,j,k,p,n;
  p=1;
  while(p==1)
  {printf("enter n(n=1 to 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;
  i=1;
  j=n/2+1;
  a[i][j]=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;
  }
  }/*这里i=i+2;j=j-1;
 a[i][j]=k; 为什么里要还要i=i+2?j=j-1? */
  for(i=1;i<=n;i++)
  { for (j=1;j<=n;j++)
 printf("%5d",a[i][j]);
  printf("\n\n");
  }
  return 0;
}


[解决办法]
魔方阵中各数的排列规律如下:
1.将1放在第一行中间一列;
2.从2开始直到N*N止各数依次按下列规则存放:每一个数存放的行比前一个数的行数
减1,列数加1(例如上面的三阶魔方阵,5 在 4 的上一行后一列);
3.如果上一数的行数为1,则下一个数和行数为N(指最下一行).例如1在第一行,则2应放在
最下一行,列数同样加1;

4.当上一个数的列数为N时,下一个数的列数应为1,行数减1.例如2在第三行最后一列则3
应放在第二行第一列;
5.如果按上面的规则确定的位置上已有数,或上一个数是第1行第N列时,则把下一个数放 在 上一个数的下面.例如按上面的确定,4应该放在第一行第二列,但该位置已被1占据所以
4就放在3 的下面.

按此方法可以得到任何阶的魔方阵.

#include<stdio.h>
void main()
{
int a[16][16],i,j,k,p,n;
p=1;
//奇数
while(p==1)
{
printf("Enter 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)&&(i>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("%4d",a[i][j]);
printf("\n");
}
}参考

热点排行