洛谷B 3940 [GESP样题 四级] 填幻方 题解
前言
今天,刷题的时候,看到了一道挂在GESP 4级的题单里的一道 \({\color{orange} 普及-}\) ,点进去一看,一道模拟题!看我秒切了它!!!(然后错了2次!)
题目解析
- 首先,输入一个 \(N\) ,然后,输出一个 \(N \times N\) 的幻方
- 接着,看看如何生成一个 \(N \times N\) 的幻方
- 一开始正方形中没有填任何数字。首先,在第一行的正中央填上 \(1\) 。
- 从上次填数字的位置向上移动一格,如果已经在第一行,则移到同一列的最后一行;再向右移动一格,如果已经在最右一列,则移动至同一行的第一列。如果移动后的位置没有填数字,则把上次填写的数字的下一个数字填到这个位置。
- 如果第 ii 步填写失败,则从上次填数字的位置向下移动一格,如果已经在最下一行,则移到同一列的第一行。这个位置一定是空的(这可太神奇了!)。把上次填写的数字的下一个数字填到这个位置。
- 重复 ii、iii 步骤,直到所有格子都被填满,幻方就完成了!
- 根据上述,把文字转化为代码,写就完了!
思路解析
此时,我们只需要将生成幻方的方式转化为代码,然后暴力模拟即可。
这道题模拟是可以的。而且只要程序写的正常写,应该是没有坑的。
Code
点击查看完整代码
#include<bits/stdc++.h>
using namespace std;
const int N=50;
int n,m,a[N][N],x,y;
int main(){
cin>>n;
a[1][n/2+1]=1;
x=1,y=n/2+1;
m=n*n;
for(int i=2;i<=m;i++){
int nx,ny;
if(x==1&&y!=n){
nx=n;
ny=y+1;
}else if(y==n&&x!=1){
ny=1;
nx=x-1;
}else if(x==1&&y==n){
nx=x+1;
ny=y;
}
else if(x!=1&&y!=n){
if(!a[x-1][y+1]){
nx=x-1;
ny=y+1;
}
else{
nx=x+1;
ny=y;
}
}
a[nx][ny]=i;
x=nx;
y=ny;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cout<<a[i][j]<<" ";
}
cout<<endl;
}
return 0;
}