hdu 1175 连连看 (DFS)

来源:互联网 发布:秦朝灭亡 知乎 编辑:程序博客网 时间:2024/05/22 02:00
#include<stdio.h>#include<string.h>int flag,map[1005][1005],v[1005][1005];int n,m,start_x,start_y,end_x,end_y,f[4][2] = { {0,1},{1,0},{0,-1},{-1,0} };void dfs(int x,int y,int num,int d){    if(num > 2) return ;    if(num == 2 && x - end_x !=0 && y - end_y != 0) return;//剪枝,不剪时间直接蹦到8000+    if(num <= 2 && x == end_x && y == end_y)    {        flag = 1;        return ;    }    if(flag)  return ;    for(int i = 0 ; i < 4 ; i ++)    {        int fx = x + f[i][0];        int fy = y + f[i][1];        if(v[fx][fy]) continue;        if(fx > 0 && fx <= n && fy > 0 && fy <= m && ( map[fx][fy] == 0 || (fx == end_x && fy == end_y) ) )        {            if(d != -1 && i != d)//判断方向是否改变               num ++;            v[fx][fy] = 1;            dfs(fx,fy,num,i);            v[fx][fy] = 0;            if(d != -1 && i != d)               num -- ;        }    }}int main(){    int i,j,T;    while(scanf("%d%d",&n,&m) && (n + m))    {        for(i = 1 ; i <= n ; i ++)         for(j = 1 ; j <= m ; j ++)          scanf("%d",&map[i][j]);        scanf("%d",&T);        while(T--)        {            scanf("%d%d%d%d",&start_x,&start_y,&end_x,&end_y);            if(start_x == end_x && start_y == end_y) continue;            if(!map[start_x][start_y] || !map[end_x][end_y] || map[start_x][start_y] != map[end_x][end_y])            {                printf("NO\n");                continue;            }            memset(v,0,sizeof(v));            flag = 0;            v[start_x][start_y] = 1;            dfs(start_x,start_y,0,-1);            v[start_x][start_y] = 0;            if(flag)               printf("YES\n");            else               printf("NO\n");        }    }    return 0;}


原创粉丝点击