魔方阵

#include <stdio.h>

/*魔方阵排列规律(必须是奇数×奇数阵)
 (1)将1放在第一行中间一列
 (2)从2开始直到n*n,各数依次按下列规则存放:
 每一个数存放的行比前一个数行减一
 列数加1
 (3)如果上一数的行数为1,则下一个数行为n(最下一行)
 (4)当上一个数列为n是时,则一下数的列数应为1,行数减1
 (5)如果按上面规则确定位置上已有数,或上一个数是第1行第n列时,则把下一个数放在上一个数的下面
*/
void main(void)
{

 int a[16][16];
 int i,j,k,p,m,n;

 p=1;  //表示阶数为偶数
 while(p==1)   //若输入的数不符合要求,提示重新输入
 {
  printf("请你输入阶数(奇数)(1--15):");
  scanf("%d",&n);

  if((n>=1) && (n<=15) && n%2!=0)
  {
   p=0;
  }
  else
  {
   NULL;
  }
 }

 //初始化
 for(i=1; i<=n; i++)
 {
  for(j=1; j<=n; j++)
  {
   a[i][j]=0;
  }
 }

 //建立魔方阵,i表示行,j表示列
 i=1;  //1所在的行
 j=(n/2)+1; //1所在的列
 a[i][j]=1;  //将1 放在第一行中间一列
 

 for(k=2; k<=n*n; k++) //将2到n*n放到方阵中
 {
  i=i-1;     //行数减1
  j=j+1;  //列数加1
  
  if(i<1 && j>n)  //上一个数是第1行第n列时,则把下一个数放在上一个数的下面
  {
   i=i+2;  //因为行数已经减1,所以需加2
   j=j-1;  //因为列数已经加1,所以需减1
  }
  else
  {
   if(i<1)   //如果上一数的行数为1,则下一个数行为n(最下一行)
    i=n;
      
   if(j>n)  //当上一个数列为n是时,则一下数的列数应为1,行数减1
   {
    j=1; //行数已经减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");
 }
}

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值