hdu1175(DFS)

来源:互联网 发布:淘宝口碑客服电话 编辑:程序博客网 时间:2024/05/16 05:07

题目链接:连连看

就连连看啊,线的转折次数不超过两次


DFS,注意剪枝,当转的次数=2,如果不能直线走过,就回溯

#include <iostream>#include <stdio.h>#include <memory.h>using namespace std;const int maxn=1005;int g[maxn][maxn];bool vis[maxn][maxn],tag;int n,m,sx,sy,ex,ey;int dx[]={-1,1,0,0};int dy[]={0,0,-1,1};bool check(int x,int y){    if(x<1||y<1||x>n||y>m)return false;    return true;}void dfs(int x,int y,int dir,int num){    if(tag)return;    if(num>2)return;    if(num==2&&x-ex!=0&&y-ey!=0) return;//剪枝    if(x==ex&&y==ey){        tag=true;        return;    }    if(g[x][y])return;    for(int i=0;i<4;i++){        int nx=x+dx[i];        int ny=y+dy[i];        if(check(nx,ny)&&!vis[nx][ny]){            vis[nx][ny]=true;            if(dir!=i)dfs(nx,ny,i,num+1);            else dfs(nx,ny,i,num);            vis[nx][ny]=false;            if(tag)return;        }    }}int main(){    //freopen("in.txt","r",stdin);    int q;    while(scanf("%d%d",&n,&m)!=EOF&&(n+m)>0){        for(int i=1;i<=n;i++){            for(int j=1;j<=m;j++){                scanf("%d",&g[i][j]);            }        }        scanf("%d",&q);        while(q--){            tag=false;            memset(vis,0,sizeof(vis));            scanf("%d %d %d %d",&sx,&sy,&ex,&ey);            if(g[sx][sy]==g[ex][ey]&&g[sx][sy]){                vis[sx][sy]=true;                for(int i=0;i<4;i++){                    int nx=sx+dx[i];                    int ny=sy+dy[i];                    if(check(nx,ny)&&!vis[nx][ny]){                        vis[nx][ny]=true;                        dfs(nx,ny,i,0);                        vis[nx][ny]=false;                        if(tag)break;                    }                }            }            if(tag)printf("YES\n");            else printf("NO\n");        }    }    return 0;}


0 0
原创粉丝点击