【C语言】——输出魔方方阵之偶魔方(阶数不为4的倍数)

思路:将其分为4部分,按顺时针方向依次为A,B,C,D。A按照奇魔方的方式对其赋值
在A的基础上对B,C,D赋值
交换A、C魔方元素,对魔方的中间行,交换从中间列向右的m列各对应元素(包括中间列)
对其他行,交换从左向右m列各对应元素。
交换B、D魔方元素,交换从中间列向左m-1列各对应元素(包括中间列)

/*
 时间:2020/08/16 
 目的:输出魔方方阵之偶魔方(阶数不为4的倍数) 
 功能:对于二维数组的一些操作 
*/
#include<stdio.h>
#define N 10

int main()
{
 int a[N][N],i,j,num,k,t;
 k=N/2;
 j=(k-1)/2,i=0;
 a[i][j]=1;
 for(num=2;num<=k*k;num++){//赋值A魔方阵 
  if((num-1)%k==0)
  i++;
  else{
   i--;
   i=(i+k)%k;
   j++;
   j=j%k;
  }
  a[i][j]=num;
 }
 
 for(i=0;i<k;i++){//依次赋值B,C,D魔方阵 
  for(j=0;j<k;j++){
   a[i][j+k]=a[i][j]+2*k*k;//对B赋值 
   a[i+k][j]=a[i][j]+3*k*k;//对C赋值
   a[i+k][j+k]=a[i][j]+k*k;//对D赋值
  }
 }
 
 for(i=0;i<k;i++){//交换A,C魔方阵的值 
  if(i==k/2){
   for(j=k/2;j<k-1;j++){
    t=a[i][j];
    a[i][j]=a[i+k][j];
    a[i+k][j]=t;
   }
  }
  else{
   for(j=0;j<(k-1)/2;j++){
    t=a[i][j];
    a[i][j]=a[i+k][j];
    a[i+k][j]=a[i][j];
   }
  } 
    }
    
    for(i=0;i<k;i++){//交换B,D的值 
     for(j=k+k/2;j>k+2;j--){
      t=a[i][j];
      a[i][j]=a[i+k][j];
      a[i+k][j]=t;
  }
 }
 
 for(i=0;i<N;i++){
  for(j=0;j<N;j++){
   printf("%5d",a[i][j]);
  }
  printf("\n");
 }
 return 0; 
}
/*
总结:将其分为4部分,按顺时针方向依次为A,B,C,D。A按照奇魔方的方式对其赋值
在A的基础上对B,C,D赋值
交换A、C魔方元素,对魔方的中间行,交换从中间列向右的m列各对应元素(包括中间列)
对其他行,交换从左向右m列各对应元素。
交换B、D魔方元素,交换从中间列向左m-1列各对应元素(包括中间列)
-----------------------
在dev中输出结果为 
   92   99    1    8   15   67   74   51   58   65
   98   80    7   14   16   73   55   57   64   66
    4    6   88   95   22   54   56   63   70   72
   85   87   19   21    3   60   62   69   71   53
   86   93   25    2    9   61   68   75   52   59
   92   99   76   83   90   42   49   26   33   40
   98   80   82   89   91   48   30   32   39   41
   79   81   13   20   97   29   31   38   45   47
   85   87   94   96   78   35   37   44   46   28
   86   93  100   77   84   36   43   50   27   34     正确
----------------------- 
*/
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值