cf 540-C. Ice Cave

来源:互联网 发布:淘宝卖家如何借贷 编辑:程序博客网 时间:2024/05/22 03:20


点击打开链接


题意:

一个地图,' . '代表冰路,踩一次以后就会变成‘ X ’,X再踩就会掉到下一层。

给你一个现成的地图,问你如果想从某个坐标出发,走到某个坐标到下一层能否到达。

题解:

直接搜索起点到终点能否联通。

然后特判重点周围能走的路有哪几种。直接就能得出能否掉下冰层:

如果终点周围只有一个位置。 那么到达该点必定走这条路,所以如果重点是X 则yes 否则 no

如果终点周围有两个及两个以上的位置。那么只要能到达该点,必定能下去。



#include <stdio.h>#include <math.h>#include <cstring>#include <algorithm>#include <queue>#define LL long longusing namespace std;char a[555][555];int v[555][555]={0};int dir[4][2]={1,0,0,1,-1,0,0,-1};int n,m,sx,sy,ex,ey,ans;int judge(int x,int y){    if(x<0||x>=n||y<0||y>=m) return 0;    if(v[x][y]==1) return 0;    if(a[x][y]=='X'){        if(x==ex-1&&y==ey-1) return 1;        else return 0;    }    return 1;}int ju(int x,int y){    if(x<0||x>=n||y<0||y>=m) return 0;    if(a[x][y]=='X') {        if(x==ex-1&&y==ey-1)return 1;        else if(x==sx-1&&y==sy-1) return 1;        else return 0;    }    return 1;}struct node{    int x,y;}e,u;void bfs(int x,int y){    e.x=x,e.y=y;    v[x][y]=1;    queue<node>que;    while(!que.empty()) que.pop();    que.push(e);    while(!que.empty()){        u=que.front();        que.pop();        if(u.x==ex-1&&u.y==ey-1) {            ans=1; return ;        }        for(int i=0;i<4;++i){            e.x=u.x+dir[i][0];            e.y=u.y+dir[i][1];            if(judge(e.x,e.y)){                que.push(e);                v[e.x][e.y]=1;            }        }    }}int main(){    ans=0;    scanf("%d %d",&n,&m);    for(int i=0;i<n;++i){        getchar();        for(int j=0;j<m;++j){            scanf("%c",&a[i][j]);        }    }    scanf("%d %d",&sx,&sy);    scanf("%d %d",&ex,&ey);    if(sx==ex&&sy==ey) {        for(int i=0;i<4;++i){            int tx=sx-1+dir[i][0];            int ty=sy-1+dir[i][1];            if(ju(tx,ty)) ans=1;        }        if(ans==1){            printf("YES\n");            return 0;        }    }    bfs(sx-1,sy-1);    int cnt=0;    for(int i=0;i<4;++i){        int tx=ex-1+dir[i][0];        int ty=ey-1+dir[i][1];        if(ju(tx,ty)) cnt++;    }    if(ans==1&&cnt>1) printf("YES\n");    else if(ans==1&&a[ex-1][ey-1]=='X'&&cnt==1) printf("YES\n");    else printf("NO\n");    return 0;}


点击打开链接


题意:

一个地图,' . '代表冰路,踩一次以后就会变成‘ X ’,X再踩就会掉到下一层。

给你一个现成的地图,问你如果想从某个坐标出发,走到某个坐标到下一层能否到达。

题解:

直接搜索起点到终点能否联通。

然后特判重点周围能走的路有哪几种。直接就能得出能否掉下冰层:

如果终点周围只有一个位置。 那么到达该点必定走这条路,所以如果重点是X 则yes 否则 no

如果终点周围有两个及两个以上的位置。那么只要能到达该点,必定能下去。


0 0
原创粉丝点击