理解了算法的思想就很简单了,
首先将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);}