CodeForces 540C - Ice Cave(BFS)
题目链接 https://vjudge.net/problem/CodeForces-540C
【题意】
n*m的地图,’X’表示有裂痕的冰块,’.’表示完整的冰块,有裂痕的冰块再被踩一次就会碎掉,完整的冰块被踩一次会变成有裂痕的冰块,现在告诉起点和终点,问从起点能否走到终点并且使终点的冰块碎掉。不能原地跳。起点和终点可能会在同一个位置。
【思路】
在只走‘.’的情况下把终点的冰踩碎,如果终点是‘X’那么这就是个BFS求最短路的简单题,如果终点是’.’,那么就需要先把终点踩成碎冰,然后再通过只走‘.’的方式走到终点位置才可以。所以在BFS的时候,如果下一个要走的点是‘.’,那么就把它修改为‘X’,第一次到达终点的时候把‘.’改为‘X’,如果还能从这里出发,只走剩下的‘.’再次回到这里,说明成功了,否则失败。
#include<bits/stdc++.h>
using namespace std;
const int maxn=505;
const int dx[4]={0,1,0,-1};
const int dy[4]={1,0,-1,0};
struct node{
int r,c;
node(int rr=0,int cc=0):r(rr),c(cc){}
};
int n,m;
int r0,c0,r1,c1;
char g[maxn][maxn];
void bfs(){
queue<node> que;
que.push(node(r0,c0));
while(!que.empty()){
node t=que.front();
que.pop();
int r=t.r;
int c=t.c;
for(int k=0;k<4;++k){
int x=dx[k]+r;
int y=dy[k]+c;
if(x<0||x>=n||y<0||y>=m) continue;
if('X'==g[x][y] && x==r1 && y==c1){
puts("YES");
return;
}
else if('.'==g[x][y]){
g[x][y]='X';
que.push(node(x,y));
}
}
}
puts("NO");
}
int main(){
scanf("%d%d",&n,&m);
for(int i=0;i<n;++i) scanf("%s",g[i]);
scanf("%d%d%d%d",&r0,&c0,&r1,&c1);
--r0,--c0,--r1,--c1;
bfs();
return 0;
}