标签:ios 玩家 类型 ret esc 鼠标 amp 分布 str
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int maze[1010][1010];
bool vis[1010][1010];
int sx,sy,ex,ey;
bool flag;
int n,m,q;
int dicx[]={1,-1,0,0};
int dicy[]={0,0,1,-1};
void dfs(int x,int y,int dic,int turns){
if(turns>2||flag) return;//转弯次数大于2或者已经找到就终止
if(turns==2&&(x-ex)!=0&&(y-ey)!=0) return;//剪枝:判断两次转弯后是否与目标在同一直线上
if(x==ex&&y==ey&&turns<=2){//搜索终点
flag=1;
return;
}
for(int i=0;i<4;++i){//搜索四个方向
int xx=x+dicx[i];
int yy=y+dicy[i];
if(xx<1||xx>n||yy<1||yy>m||vis[xx][yy]) continue;//边界情况
if(maze[xx][yy]==0||(xx==ex&&yy==ey)){
vis[xx][yy]=1;
if(dic==-1||dic==i)//如果在起点或者同向的情况turns不变及不转向,并将当前方向记为i
dfs(xx,yy,i,turns);
else
dfs(xx,yy,i,turns+1);//否则turns+1
vis[xx][yy]=0;
}
}
return;
}
int main(){
while(~scanf("%d%d",&n,&m)){
if(n==0&&m==0)
break;
memset(maze,0,sizeof(maze));
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
scanf("%d",&maze[i][j]);
scanf("%d",&q);
for(int i=0;i<q;++i){
scanf("%d%d%d%d",&sx,&sy,&ex,&ey);
memset(vis,0,sizeof(vis));
flag=0;//初始化
if(maze[sx][sy]==maze[ex][ey]&&maze[sx][sy])
dfs(sx,sy,-1,0);//将初始方向设为-1
if(flag) printf("YES\n");
else printf("NO\n");
}
}
return 0;
}
标签:ios 玩家 类型 ret esc 鼠标 amp 分布 str
原文地址:https://www.cnblogs.com/lyj1/p/11516975.html