题解:本题主要考查模拟,数学。关键是读题,知道构幻方的规律,把幻方看做立体的就不怕边界。注意数字重合和重复问题。
代码如下:
#include <iostream>
using namespace std;
int a[40][40],n,i,j,k;
int main()
{
cin>>n;
a[1][n/2+1]=1;
j=1;k=n/2+1;
for(i=2;i<=n*n;i++)
{
if(j==1&&k!=n)
if(a[n][k+1]==0){a[n][k+1]=i;j=n;k=k+1;continue;}
else{a[j+1][k]=i;j=j+1;continue;}
if(j!=n&&k==n&&j!=1)
if(a[j-1][1]==0){a[j-1][1]=i;j=j-1;k=1;continue;}
else{a[j+1][k]=i;j=j+1;continue;}
if(j==1&&k==n)
if(a[n][1]==0){a[n][1]=i;j=n;k=1;continue;}
else{a[j+1][k]=i;j=j+1;continue;}
if(j==n&&k==n)
if(a[j-1][1]==0){a[j-1][1]=i;j=j-1;k=1;continue;}
else{a[1][k]=i;j=1;continue;}
if(j!=1&&k!=n)
if(a[j-1][k+1]==0){a[j-1][k+1]=i;j=j-1;k=k+1;continue;}
else{a[j+1][k]=i;j=j+1;continue;}
}
for(j=1;j<=n;j++)
{
for(k=1;k<=n;k++)
cout<<a[j][k]<<" ";
cout<<endl;
}
return 0;
}