zoukankan      html  css  js  c++  java
  • HDU_1175_dfs

    http://acm.hdu.edu.cn/showproblem.php?pid=1175

    dfs(x,y,i,num),xy表示位置,i表示方向,num表示转向次数,num=2时候的剪枝很重要。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int a[1005][1005],vis[1005][1005],n,m,endx,endy,dis[4][2] = {{-1,0},{0,-1},{1,0},{0,1}},flag;
    
    void dfs(int x,int y,int dir,int num)
    {
        if(flag)    return;
        if(x == endx && y == endy)
        {
            flag = 1;
            return;
        }
        if(num == 2)
        {
            if(dir == 0||dir == 2)
            {
                if(y != endy)   return;
            }
            else
            {
                if(x != endx)   return;
            }
        }
        int xx,yy;
        for(int i = 0;i < 4;i++)
        {
            xx = x+dis[i][0];
            yy = y+dis[i][1];
            if(xx < 1 || xx > n || yy < 1 || yy > m || vis[xx][yy])  continue;
            if(xx == endx && yy == endy || a[xx][yy] == 0)
            {
                vis[xx][yy] = 1;
                if(i == dir)    dfs(xx,yy,dir,num);
                else if(num < 2)dfs(xx,yy,i,num+1);
                vis[xx][yy] = 0;
            }
        }
    
    }
    int main()
    {
        while(cin >> n >> m && n &&m)
        {
            flag = 0;
            for(int i = 1;i <= n;i++)
            {
                for(int j = 1;j <= m;j++)   cin >> a[i][j];
            }
            int num;
            cin >> num;
            while(num--)
            {
                int beginx,beginy;
                cin >> beginx >> beginy >> endx >> endy;
                if(beginx == endx && beginy == endy || a[beginx][beginy] != a[endx][endy] || a[beginx][beginy] == 0)
                {
                    cout << "NO" << endl;
                    continue;
                }
                flag = 0;
                memset(vis,0,sizeof(vis));
                for(int i = 0;i < 4;i++)
                {
                    if(!flag)   dfs(beginx,beginy,i,0);
                }
                if(flag)    cout << "YES" << endl;
                else    cout << "NO" << endl;
            }
        }
        return 0;
    }
  • 相关阅读:
    tab切换与表格展示
    ajax
    api
    slice() 方法
    iframe跳转
    快排序
    【问题排查】cpu占用过高排查
    LOJ6013 负载平衡 [最小费用最大流]
    随机序列 [思维题, 组合数]
    P1777 帮助 [状压dp]
  • 原文地址:https://www.cnblogs.com/zhurb/p/5873253.html
Copyright © 2011-2022 走看看