#include <stdio.h> #include <stdlib.h>
void Init(int **a,int n); void Change(int **a,int n); void Print(int **a,int n); void main() { int **a; int i,n; do{ printf("输入一个双偶数: ");//输入一个双偶数,满足n%4=0
scanf("%d",&n); fflush(stdin); }while(n<3||(n%4!=0));
a=(int **)malloc(n*sizeof(int *)); //建立动态数组
if(!a) exit(-1); for(i=0;i<n;i++) { a[i]=(int *)malloc(n*sizeof(int)); if(!a[i]) exit(-1); }
Init(a,n);//初始化 Change(a,n);//魔方阵转换 Print(a,n);//输出 getchar(); } //初始化函数 void Init(int **a,int n) { int i,j,k=1; for(i=0;i<n;i++) for(j=0;j<n;j++) a[i][j]=k++; return; } //转换函数,核心算法 void Change(int **a,int n) { int m,t,x,y,i,j,_i,_j;//_i,_j标记
m=n/4; for(x=0;x<m;x++) for(y=0;y<m;y++) if(x<y||((x<(m+1)/2)&&x==y)) { for(i=4*x,_i=0;_i<4;i++,_i++) for(j=4*y,_j=0;_j<4;j++,_j++) if(_i==_j||(_i+_j)%3==0) { t=a[i][j]; a[i][j]=a[n-1-i][n-1-j]; a[n-1-i][n-1-j]=t; } }
if(m%2!=0) //特例,对于中心矩阵的转换,这里最多执行一步
for(i=(m+1)%2,_i=0;_i<2;i++,_i++) for(j=(m+1)%2,_j=0;_j<4;j++,_j++) if(_i==_j||(_i+_j)%3==0) { t=a[i][j]; a[i][j]=a[n-1-i][n-1-j]; a[n-1-i][n-1-j]=t; } return; } //输出函数 void Print(int **a,int n) { int i,j; for(i=0;i<n;i++) { for(j=0;j<n;j++) printf("%8d",a[i][j]); printf("\n"); } return; }
|