洛谷B 3940 [GESP样题 四级] 填幻方 题解

原题传送门

前言

今天,刷题的时候,看到了一道挂在GESP 4级的题单里的一道 \({\color{orange} 普及-}\) ,点进去一看,一道模拟题!看我秒切了它!!!(然后错了2次!)

题目解析

  1. 首先,输入一个 \(N\) ,然后,输出一个 \(N \times N\)幻方
  2. 接着,看看如何生成一个 \(N \times N\) 的幻方
    1. 一开始正方形中没有填任何数字。首先,在第一行的正中央填上 \(1\)
    2. 从上次填数字的位置向上移动一格,如果已经在第一行,则移到同一列的最后一行;再向右移动一格,如果已经在最右一列,则移动至同一行的第一列。如果移动后的位置没有填数字,则把上次填写的数字的下一个数字填到这个位置。
    3. 如果第 ii 步填写失败,则从上次填数字的位置向下移动一格,如果已经在最下一行,则移到同一列的第一行。这个位置一定是空的(这可太神奇了!)。把上次填写的数字的下一个数字填到这个位置。
    4. 重复 ii、iii 步骤,直到所有格子都被填满,幻方就完成了!
  3. 根据上述,把文字转化为代码,写就完了!

思路解析

此时,我们只需要将生成幻方的方式转化为代码,然后暴力模拟即可。
这道题模拟是可以的。而且只要程序写的正常写,应该是没有坑的。

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;
}
完结撒花!(补药在抄题解了!!)
posted @ 2025-04-19 11:00  Zpy_101001  阅读(118)  评论(0)    收藏  举报