题解: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;
}

                
            
浙公网安备 33010602011771号