cf 540-C. Ice Cave



点击打开链接


题意:

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

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

题解:

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

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

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

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



#include <stdio.h>
#include <math.h>
#include <cstring>
#include <algorithm>
#include <queue>
#define LL long long
using 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值