题解:B3940 [GESP样题 四级] 填幻方
_Deer_Peach_ · · 题解
纯模拟:
第一步:
把一填进第一行中央:
int x=0,y=n/2;
a[x][y]=1;
第二步:
需要变横、纵坐标:
int tx=(x+n-1)%n;//上次填数位置横轴变化
int ty=(y+1)%n;//上次填数位置纵轴变化
第三步:
第二步填数失败:
tx=(x+1)%n;//上次填数位置横轴变化
ty=y;//上次填数位置纵轴不变
最后:
结合代码:
#include<bits/stdc++.h>
using namespace std;
int n;
int a[25][25];
int main(){
cin>>n;//输入
int x=0,y=n/2;//初始坐标
a[x][y]=1;//第一步操作:第一行中间填1
for(int cnt=2;cnt<=n*n;cnt++){//重复第二步和第三步操作
int tx=(x+n-1)%n;//上次填数位置横轴变化
int ty=(y+1)%n;//上次填数位置纵轴变化
if(a[tx][ty]==0){//第二步填数成功
a[tx][ty]=cnt;//填数
}else{//第二步没成功做第三步操作
tx=(x+1)%n;//上次填数位置横轴变化
ty=y;//上次填数位置纵轴不变
a[tx][y]=cnt;//填数
}
x=tx;//更新横轴
y=ty;//更新纵轴
}
for(int i=0;i<n;i++){//输出
for(int j=0;j<n;j++){
cout<<a[i][j]<<" ";
}
cout<<endl;
}
return 0;//结束
}