`
xitongyunwei
  • 浏览: 933645 次
文章分类
社区版块
存档分类
最新评论

魔方算法

 
阅读更多

#include<stdio.h>
#include<stdlib.h>

#define MAXSIZE 20
#define MARK -1
#define SWAP(x,y) {int t;t=x;x=y;y=t;}

void Magic_o(int matrix[MAXSIZE][MAXSIZE],int n); /*单奇数阶*/
void Magic_se(int matrix[MAXSIZE][MAXSIZE],int n); /*单偶数阶*/
void Magic_de(int matrix[MAXSIZE][MAXSIZE],int n); /*双偶数阶*/
void Exchange(int x[][MAXSIZE],int n); /*交换函数,用于处理单偶数阶*/

void Magic_o(int matrix[MAXSIZE][MAXSIZE],int n)
{
int count;
int row=0; /*从第零列*/
int column=n/2; /*中间行开始*/

for(count=1;count<=n*n;count++)
{
matrix[row][column]=count;
if(count%n==0)
row++;
else
{
row=(row==0)?n-1:row-1;
column=(column==n-1)?0:column+1;
}
}
}

void Magic_se(int matrix[MAXSIZE][MAXSIZE],int n)
{
int count;
int row=0;
int column=n/2;

for(count=1;count<=n*n;count++) //把该数组分成四部分,形如:
{ // ************************
matrix[row][column]=count; /*A*/ // A C
matrix[row+n][column+n]=count+n*n; /*B*/
matrix[row][column+n]=count+2*n*n; /*C*/ // D B
matrix[row+n][column]=count+3*n*n; /*D*/ // *************************
if(count%n==0)
row++;
else
{
row=(row==0)?n-1:row-1;
column=(column==n-1)?0:column+1;
}
}
Exchange(matrix,2*n);
}

void Magic_de(int matrix[MAXSIZE][MAXSIZE],int n)
{
int count,inv_count;
int marker;
marker=MARK;
int row,column;

for(row=0;row<n/2;row++,marker=-marker)
for(column=0;column<n/2;column++,marker=-marker)
matrix[row][column]=matrix[row][n-1-column]=marker;
count=1;
inv_count=n*n;
for(row=0;row<n/2;row++)
for(column=0;column<n;column++)
if(matrix[row][column]!=MARK)
{
matrix[row][column]=count++;
matrix[n-1-row][n-1-column]=inv_count--;
}
else
{
matrix[row][column]=inv_count--;
matrix[n-1-row][n-1-column]=count++;
}
printf("\n");
}

void Exchange(int x[][MAXSIZE],int n)
{
int width=n/4;
int width1=width-1;
int i,j;

for(i=0;i<n/2;i++)
if(i!=width)
{
for(j=0;j<width;j++)
SWAP(x[i][j],x[n/2+i][j]);
for(j=0;j<width1;j++)
SWAP(x[i][n-1-j],x[n/2+i][n-1-j]);
}
else
{
for(j=1;j<=width;j++)
SWAP(x[width][j],x[n/2+width][j]);
for(j=0;j<=width1;j++)
SWAP(x[width1][n-1-j],x[n/2+width1][n-1-j]);
}
}

int main()
{
int matrix[MAXSIZE][MAXSIZE];
int order;
int i,j;
char line[100];

printf("\n Order Please-->");
gets(line);
order=atoi(line);
printf("\n Magic Square Generator");
printf("\n================================");
if(order<=1)
printf("\n*** ERROR ***Order should be >=2");
else if(order>MAXSIZE){
printf("\n*** ERROR *** Order should be <= %d",MAXSIZE);
exit(0);
}
else if(order%2==1)
Magic_o(matrix,order);
else if(order%2==0 && order%4==2)
Magic_se(matrix,order/2);
else
Magic_de(matrix,order);
printf("\n\nmagic squre of order %d :\n\t",order);
for(i=0;i<order;i++)
{
for(j=0;j<order;j++)
printf("%4d",matrix[i][j]);
printf("\n\t");
}
}

//测试结果:

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics