题意:
有n*m的冰面,. 表示完整的冰块,X表示残破的冰块,如果踩到完整的冰块,则冰块会变成残破的冰块,如果踩到残破的冰块,则人会坠落,
现给出r1,c1起始点,起始点是残破的冰块。终点r2,c2,要求从起始点走的终点,并在终点坠落。不能原地踩踏。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
const int maxn = 550;
char maze[maxn][maxn];
const int dir[4][2] = {1,0,-1,0,0,1,0,-1};
typedef struct node{
int x,y;
}point;
bool operator == (const point &a,const point &b) {
return (a.x == b.x && a.y == b.y);
}
point start,ending;
int n,m;
void init()
{
for(int i=1;i<=n;i++) {
for(int j=1;j<=m;j++) cin>>maze[i][j];
}
}
bool bfs()
{
queue<point> qu;
qu.push(start);
while(!qu.empty())
{
point it = qu.front();qu.pop();
for(int i=0;i<4;i++)
{
int mx = it.x + dir[i][0],my = it.y + dir[i][1];
if(mx <= 0 || mx > n || my <= 0 || my > m ) continue;
if(maze[mx][my] == '.') {
maze[mx][my] = 'X';
point temp = {mx,my};
qu.push(temp);
}
else if(maze[mx][my] == 'X' && mx == ending.x && my == ending.y) return true;
}
}
return false;
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
init();
scanf("%d%d%d%d",&start.x,&start.y,&ending.x,&ending.y);
if(bfs()) printf("YES\n");
else printf("NO\n");
}
return 0;
}