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