题意:
一个地图,' . '代表冰路,踩一次以后就会变成‘ 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
如果终点周围有两个及两个以上的位置。那么只要能到达该点,必定能下去。