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;
}
posted @ 2018-04-02 16:28  不想吃WA的咸鱼  阅读(124)  评论(0编辑  收藏  举报