标签: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