#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;
}
|