当终点为 “ X ” 时,只要起点能到达终点就输出 " YES " 。
当终点为 " . " 时,输出" YES " 的条件为 1:到达 。
2:终点边上四个方块中除了包含在到达终点的路径上
的那块,至少还有一块是可走的 " . " 或者是起点。
#include <iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string.h>
using namespace std;
int a[505][505];
int b[505][505];
int n,m;
int fx,fy;
int s1,s2,e1,e2;
int dir[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
int dfs(int x,int y){
a[x][y]=1;
for(int i=0;i<4;i++){
int xx=x+dir[i][0];
int yy=y+dir[i][1];
if(xx==e1&&yy==e2){fx=x;fy=y;return 1;}
if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&a[xx][yy]==0){
//a[x][y]=1;
if(dfs(xx,yy))return 1;
}
}
return 0;
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF){
memset(a,0,sizeof(a));
char tmp;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>tmp;
a[i][j]=tmp=='.'?0:1;
b[i][j]=a[i][j];
}
}
scanf("%d%d%d%d",&s1,&s2,&e1,&e2);
if(b[e1][e2]==1){
if( dfs(s1,s2) )puts("YES");
else puts("NO");
}
else{
if( dfs(s1,s2) ){
int num=0;
for(int i=0;i<4;i++){
int xx=e1+dir[i][0];
int yy=e2+dir[i][1];
if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&b[xx][yy]==0&& (xx!=fx||yy!=fy ) )num++;
if(xx>=1&&xx<=n&&yy>=1&&yy<=m&&xx==s1&&yy==s2&& (xx!=fx||yy!=fy ) )num++;
}
if( num>=1)puts("YES");
else puts("NO");
}
else puts("NO");
}
}
return 0;
}