理解了算法的思想就很简单了,
首先将1放到第一排的中间,然后向左上角走,当行数超过索引,则将该数放到最后一排接下来的一列中去,当列数超过索引,则放到上一排的第一列中去,若都没有超过索引,但是此时的右上角有数或是已经到魔方阵的最右上角那块,那么列数不变,向下行走去。每次放好一个数之后,数本身加1,并继续放已经加1后的数。
#include<stdio.h>
int IsAttact(int **p,int i,int j,int n)
{
if((i-1<=0)&&(j+1>n))
{
return 0;
}
else if(i-1<=0)
{
return 1;
}
else if(j+1>n)
{
return 2;
}
else if(p[i-1][j+1]!=0)
{
return 3;
}
else
{
return 4;
}
}
void Cube(int **p,int n)
{
int i=1;
int j=n/2+1;
int sum=2;
while (sum<=n*n)
{
int value=IsAttact(p,i,j,n);
if(value==1)
{
i=n;j=j+1;
p[i][j]=sum;
}
else if(value==2)
{
i=i-1;j=1;
p[i][j]=sum;
}
else if(value==3||value==0)
{
i=i+1;
p[i][j]=sum;
}
else if(value==4)
{
i=i-1;j=j+1;
p[i][j]=sum;
}
sum=sum+1;
}
}
void output(int **p,int n)
{
for(int i1=1;i1<=n;i1++)
{
for(int j1=1;j1<=n;j1++)
{
printf("%d\t",p[i1][j1]);
}
printf("%\n");
}
}
void main()
{
int n;
printf("请输入魔方的阶数\n");
scanf("%d",&n);
int **p=new int*[n];
for(int i=1;i<=n;i++)
{
p[i]=new int[n];
}
for(int i1=1;i1<=n;i1++)
{
for(int j1=1;j1<=n;j1++)
{
p[i1][j1]=0;
}
}
p[1][n/2+1]=1;
Cube(p,n);
output(p,n);
}