hdu 1175 连连看 (DFS)

#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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值