题解:AT_joi2022_yo2_b カーペット (Carpet)

题目传送门


AT_joi2022_yo2_b カーペット (Carpet) 题解:

思路:

因为地图很大 \(1 \le n \le 500 , 1 \le m \le 500\)。所以我们使用 bfs。一道 bfs 板子题,记住颜色不能相同。一定要用二维数组标记做过的路,不然会 TLE!

注意:

  • 队列用结构体:有 \(x\)\(y\) 和步数。
  • 注意判断:
if(tx<=n&&tx>=1&&ty<=m&&ty>=1&&!v[tx][ty]&&s[now.x ][now.y]!=s[tx][ty])
  • 从起点开始找,找到终点就输出步数并结束程序(记住 \(n\)\(m\) 不要搞混)。不然一定要输出 \(-1\)

bfs 模版:

q.push(初始状态);//将初始状态入队
while(!q.empty()){
	node u=q.front();//取出队首
	q.pop();//出队
	for(枚举所有可扩展状态) //找到 u 的所有可达状态 v
	    if(是合法的) // v 需要满足某些条件
	       q.push(x); //入队(同时可能需要维护某些必要信息) 
}

代码:

#include<bits/stdc++.h>
using namespace std;
struct node{
	int x,y,floor;
};
int n,m,dx[]={0,1,-1,0,0},dy[]={0,0,0,-1,1};
queue<node> q;
char s[510][510];
bool v[510][510];
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>s[i][j];
		}
	}
	q.push(node{1,1,0});
	node now;
	v[1][1]=1;
	while(!q.empty()){
		now=q.front();
		q.pop();
		if(now.x==n&&now.y ==m){
			cout<<now.floor;
			return 0;
		}
		for(int i=1;i<=4;i++)
		{
			int tx=now.x+dx[i],ty=now.y+dy[i];
			if(tx<=n&&tx>=1&&ty<=m&&ty>=1&&!v[tx][ty]&&s[now.x ][now.y]!=s[tx][ty]){
				q.push(node{tx,ty,now.floor+1});
				v[tx][ty]=1;
			}
		}
	}
	cout<<-1;
	return 0;
}


posted @ 2025-07-26 18:49  WMWD  阅读(3)  评论(0)    收藏  举报