用C语言求n阶魔方阵

  • /*
    • 给出n值,输出n阶魔方阵(每一行,每一列和对角线之和都相等)
    • 1放在第一行中间
    • 从2开始以后的数按以下规则:
    • 每个数比前一个数行数减一,列数加一
    • 当上一个数行数为1,下一个数行数为n
    • 当上一个数列数为n,下一个数列数为1
    • 如果按以上规则确定的位置上已经有数,或上一个数为第一行第n列,把下一个数放在上一个数的下面
      */
#include<stdio.h>
int main()
{
  int n,i,j;
  int x,y;
  int p,q;
  int a[20][20]={0};
  printf("输入一个奇数:");
  scanf("%d",&n);
  x = 0;
  y = (n-1)/2;
  a[x][y]=1;//第一行最中间的数为1

  for(i=2;i<=n*n;i++){

       p=x;q=y;//把上一个元素的位置记录在p q中以便继续使用
       x=x-1;
       y=y+1;
       //如果上一个数为第一行第n列,把下一个数放在上一个数的下面
       if(x== -1&&y==n){
            x=p+1;
            y=q;
      a[x][y] = i;
           // printf("one i值%d",i);
          }
       //当上一个数行数为1时,下一个数行数为
       else if(x== -1&&y<=n-1){

              x = n-1;
            //如果按以上规则确定的位置上已经有数把
            //下一个数放在上一个数的下面
            if(a[x][y]!=0){
               x = p+1;
               y = q;

                }
           // printf("two i值%d",i);

            a[x][y] = i;

         }
       //当上一个数列数为n,下一个数列数为1
       else if(x>=0&&y==n){

            y = 0;
          //如果按以上规则确定的位置上已经有数把
          //下一个数放在上一个数的下面
          if(a[x][y]!=0){
               x = p+1;
               y = q;
  }

           a[x][y] = i;

         }
       //如果没有特殊情况,每个数比前一个数行数减一,列数加一
       else if(x>=0&&y<=n-1){
          // 如果按以上规则确定的位置上已经有数把
          //下一个数放在上一个数的下面
            if(a[x][y]!=0){
               x = p+1;
               y = q;
                }

           a[x][y] = i;

        }
   }

   for(i=0;i<=n-1;i++){
        for(j=0;j<=n-1;j++){
            printf("%4d",a[i][j]);
          }
      printf("\n");

      }
}

猜你喜欢

转载自blog.csdn.net/zuiziyoudexiao/article/details/79945501