题解: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号