被这个题的方向弄得是晕乎乎的,索性按照常规来,注意的是面向东向右走也就是面向西往左走,所以从两头共同向前走,当从出发点走的路径到达终点时,看从终点出发的路径有木有到达起始点,如果到了则说明该条件符合要求。
#include<iostream>
#include<string>
using namespace std;
int a[101][101],vis[101][101];
int n,m,w,x0,y0,x1,y1;
int pa[]={0,2,3,1};//北南西东
int dis[4][2]={-1,0,0,1,1,0,0,-1};//前左后右
bool check(int a,int b){
if(a <0 || a>=n || b <0 || b>=m)return 0;
return 1;
}
bool dfs(int bx,int by,int begin,int ex,int ey,int end )
{
if(bx==x1 && by==y1)
return (ex==x0 && ey==y0);
if(ex==x0 && ey==y0)
return(bx==x1 && by==y1);
int bbx,bby,eex,eey;
int i,j;
for(i=0;i<4;i++){
j=(begin+pa[i])%4;
bbx=bx+dis[j][0];
bby=by+dis[j][1];
j=(end+pa[i])%4;
eex=ex+dis[j][0];
eey=ey+dis[j][1];
if(!check(bbx,bby)||!check(eex,eey))
continue;
if(vis[bbx][bby]||a[bbx][bby]||a[eex][eey])
continue;
vis[bbx][bby]=1;
if(dfs(bbx,bby,(begin+pa[i])%4,eex,eey,(end+pa[i])%4))
return 1;
vis[bbx][bby]=0;
}
return 0;
}
int main(){
int i,x,y;
while(scanf("%d%d",&n,&m)!=EOF){
scanf("%d%d%d%d",&x0,&y0,&x1,&y1);
scanf("%d",&w);
memset(a,0,sizeof(a));
for(i=0;i<w;i++){
scanf("%d%d",&x,&y);
a[x][y]=1;
}
memset(vis,0,sizeof(vis));
vis[x0][y0]=1;
if(dfs(x0,y0,1,x1,y1,3))
printf("YES\n");
else
printf("NO\n");
}
return 0;
}