3、后一个数存放的列数比前一个数存放的列数加1,若这个列数为N+1,则取列数为1;
4、如果前一个数是N的倍数,则后一个数存放的列数不变,而行数加1。 即放在前一个数的下面,也可以按照2、3算得的现在这个数位置上已经有数时直接把现在这个数放在它上一个数字的下面。
using namespace std;
void check(int **arr,int n)
{
int r;
int c;
int sum[4]={0};
for (r=0;r<n;r++)
{
sum[0]=0;
sum[1]=0;
sum[2]+=arr[r][r];
sum[3]+=arr[n-r-1][r];
for (c=0;c<n;c++)
{
sum[0]+=arr[r][c];
sum[1]+=arr[c][r];
}
cout<<"第"<<r+1<<"行:"<<sum[0]<<"\t第"<<r+1<<"列:"<<sum[1]<<endl;
}
cout<<"右 斜:"<<sum[2]<<"\t左 斜:"<<sum[3]<<endl;;
}
void odd(int **cub,int n)
{
cub[0][(n-1)/2]=1;
int prex=0;int prey=(n-1)/2;
for(int k=2;k<=n*n;k++)
{ int nowx,nowy;
if((k-1)%n==0)
{
nowx=prex+1;
nowy=prey;
}
else
{
nowx=prex-1;
nowy=prey+1;
if(nowx<0)
nowx=n-1;
if(nowy>=n)
nowy=0;
}
cub[nowx][nowy]=k;
prex=nowx;
prey=nowy;
}
}
void main()
{ int n;
cout<<"请输入大于2的正整数n\n";
cin>>n;
int **cub=new int*[n];
for(int i=0;i<n;i++)
{
cub[i]=new int[n];
memset(cub[i],0,sizeof(int)*n);
}
if(n%2)//奇数
{
odd(cub,n);
}
else if(n%4==0)//能被4整除的情况
{
int temp[8]={0};
int cnt=1;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
cub[i][j]=cnt;
cnt++;
}
for(int p=0;p<=4*(n/4-1);p=p+4)
for(int q=0;q<=4*(n/4-1);q=q+4)
{
for(int m=0;m<4;m++)
{
cub[m+p][m+q]=n*n+1-cub[m+p][m+q];
cub[m+p][3-m+q]=n*n+1-cub[m+p][3-m+q];
}
}
}
else //不能被4整除的偶数
{
int nn=n/2;
int k=n/4;
int **smallcub=new int *[nn];
for(int i=0;i<nn;i++)
{
smallcub[i]=new int[nn];
memset(smallcub[i],0,sizeof(int)*nn);
}
odd(smallcub,nn);
for(i=0;i<nn;i++)
for(int j=0;j<nn;j++)
{
cub[i][j]=smallcub[i][j];
cub[i+nn][j+nn]=smallcub[i][j]+nn*nn;
cub[i][j+nn]=smallcub[i][j]+2*nn*nn;
cub[i+nn][j]=smallcub[i][j]+3*nn*nn;
}
int middle=(nn-1)/2;
for( i=0;i<nn;i++)
for(int j=0;j<k;j++)
{
if(i==middle)
{
int temp=cub[i][middle+j];
cub[i][middle+j]=cub[i+nn][middle+j];
cub[i+nn][middle+j]=temp;
}
else
{
int temp=cub[i][j];
cub[i][j]=cub[i+nn][j];
cub[i+nn][j]=temp;
}
}
for(i=0;i<nn;i++)
{
for(int j=0;j<k-1;j++)
{
int temp=cub[i][middle-j+nn];
cub[i][middle-j+nn]=cub[i+nn][middle-j+nn];
cub[i+nn][middle-j+nn]=temp;
}
}
}
for(i=0;i<n;i++)
{ for(int j=0;j<n;j++)
{
cout<<cub[i][j]<<"\t ";
}
cout<<endl;
}
check(cub,n);
}