先BFS到终点,然后加点判断,如果终点是' X ',直接就可以YES,如果是' .' 要看看他四周有几个也以去的点,大于等于两个则YES,否则NO,因为有一个点是走过来的,只要还存在一个点可以走,走一下这个点然后再回去即可
有几个特殊的样例需要考虑
当起点和终点重合时,周围只要有一个可以走的点即可,因为起点一定是‘ X ’ ,只需有一个点走一下在回来即可
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<string>
#include<algorithm>
#include<queue>
#include<vector>
#include<map>
#include<set>
#define MEM(a) memset(a,0,sizeof(a))
typedef long long ll;
using namespace std;
struct node
{
int x,y;
}re,pe;
char mapp[600][600];
int book[600][600];
int n,m,xx1,xx2,yy1,yy2;//起点坐标和终点坐标
int ne[4][2]={0,1,0,-1,1,0,-1,0};//方向数组
int check(node t)//BFS的判断函数
{
if(t.x==xx2&&t.y==yy2)
return 0;
if(t.x<0||t.x>=n||t.y<0||t.y>=m||mapp[t.x][t.y]=='X'||book[t.x][t.y])
{
return 1;
}
return 0;
}
int check1(node t)//判断终点四周有几个可走的点
{
if(t.x==xx1&&t.y==yy1)
return 0;
if(t.x<0||t.x>=n||t.y<0||t.y>=m||mapp[t.x][t.y]=='X')
{
return 1;
}
return 0;
}
int bfs(node begin)
{
int i;
queue<node>q;
q.push(begin);
while(!q.empty())
{
re=q.front();
q.pop();
if(re.x==xx2&&re.y==yy2)
{
if(mapp[re.x][re.y]=='X')
{
printf("YES\n");
return 0;
}
int mx=0;
for(i=0;i<4;i++)
{
pe=re;
pe.x+=ne[i][0];
pe.y+=ne[i][1];
if(check1(pe))
continue;
mx++;
}
if(mx>=2)
{
printf("YES\n");
return 0;
}
}
for(i=0;i<4;i++)
{
pe=re;
pe.x+=ne[i][0];
pe.y+=ne[i][1];
if(check(pe))
continue;
book[pe.x][pe.y]=1;
q.push(pe);
}
}
printf("NO\n");
return 0;
}
int main()
{
scanf("%d %d",&n,&m);
getchar();
for(int i=0;i<n;i++)
{
scanf("%s",mapp[i]);
}
scanf("%d %d",&xx1,&yy1);
scanf("%d %d",&xx2,&yy2);
xx1--;
yy1--;
xx2--;
yy2--;
//地图保存下标从0开始。。。。。懒得改上面了。。
if(xx1==xx2&&yy1==yy2)
{
re.x=xx1;
re.y=yy1;
int mx=0;
for(int i=0;i<4;i++)
{
pe=re;
pe.x+=ne[i][0];
pe.y+=ne[i][1];
if(check1(pe))
continue;
mx++;
}
if(mx>=1)
printf("YES\n");
else
printf("NO\n");
return 0;
}
node begin;
begin.x=xx1;
begin.y=yy1;
bfs(begin);
return 0;
}