HDU 1175 连连看

转载请注明出处:http://blog.csdn.net/a1dark

分析:这题有点坑、数据有点问题、做不过的就看看别人过了的代码、就会发现要错误的理解才能AC、

这道题可以DFS或者BFS都能轻松过、但是还是要养成剪枝的习惯、

 

#include <stdio.h>

#include <string.h>

int map[1015][1015];

int vis[1015][1015];

int n,m,x1,x2,y1,y2,flag;

void dfs(int x,int y,int z,int k){

    if(flag)

    return;

    if(k>=3)

    return ;

    if(x<=0 || y<=0 || x>n || y>m)

    return ;

    if(x == x2 && y == y2){

        flag = 1;

        return ;

    }

    if(k == 2){

        if(!(z == 1&& x>x2&& y==y2||z == 2&&x<x2&&y==y2||z ==3&&y>y2&&x==x2||z==4&&y<y2&&x==x2))

        return;

    }

    if(map[x][y]!=0) return;

    if(vis[x][y]) return ;

    vis[x][y] = 1;

    if(z == 1){

        dfs(x-1,y,1,k);

        dfs(x+1,y,2,k+1);

        dfs(x,y-1,3,k+1);

        dfs(x,y+1,4,k+1);

    }

    else if(z == 2){

        dfs(x-1,y,1,k+1);

        dfs(x+1,y,2,k);

        dfs(x,y-1,3,k+1);

        dfs(x,y+1,4,k+1);

    }

    else if(z == 3){

        dfs(x-1,y,1,k+1);

        dfs(x+1,y,2,k+1);

        dfs(x,y-1,3,k);

        dfs(x,y+1,4,k+1);

    }

    else if(z == 4){

        dfs(x-1,y,1,k+1);

        dfs(x+1,y,2,k+1);

        dfs(x,y-1,3,k+1);

        dfs(x,y+1,4,k);

    }

    vis[x][y] = 0;

}

int main(){

    while(~scanf("%d%d",&n,&m)){

        if(!n&&!m)

            break;

        int i,j;

        for(i = 1; i<=n; i++)

            for(j = 1; j<=m; j++)

                scanf("%d",&map[i][j]);

        int t;

        scanf("%d",&t);

        while(t--){

            flag = 0;

            memset(vis,0,sizeof(vis));

            scanf("%d%d%d%d",&x1,&y1,&x2,&y2);

            if(x1 == x2 && y1 == y2 && map[x1][y1]!=0)

                printf("NO\n");

            else if(map[x1][y1] == map[x2][y2] && map[x1][y1]){

                dfs(x1-1,y1,1,0);

                dfs(x1+1,y1,2,0);

                dfs(x1,y1-1,3,0);

                dfs(x1,y1+1,4,0);

                if(flag)

                    printf("YES\n");

                else

                    printf("NO\n");

            }

            else

                printf("NO\n");

        }

    }

    return 0;

}


 


 

你可能感兴趣的:(HDU)