zoukankan      html  css  js  c++  java
  • DFS 专题 Tempter of the Bone

    这道题的剪枝:奇偶性,曼哈顿距离类型的。不剪会超时。

    # include <cstdio>
    # include <cstring>
    
    using namespace std;
    
    # define N 7 + 3
    # define ABS(x) (((x)>0)?(x):(-(x)))
    
    int si, sj, gi, gj;
    int n, m, T;
    char g[N][N];
    bool vis[N][N];
    bool finished;
    
    const int dir[][2] = {{0,1}, {1,0}, {0,-1}, {-1,0}};
    
    void dfs(int x, int y, int t)
    {
        int tmp = ABS(x-gi)+ABS(y-gj);
        if (tmp > t) return;
        if (tmp%2 != t%2) return ;
        if (t == 0) finished = (x == gi && y == gj);
        else for (int d = 0; d < 4; ++d)
        {
            int nx = x + dir[d][0], ny = y + dir[d][1];
            if (1<=nx&&nx<=n && 1<=ny&&ny<=m && g[x][y]!='X' && vis[nx][ny]==false)
            {
                vis[nx][ny] = true;
                dfs(nx, ny, t-1);
                if (finished) return ;
                vis[nx][ny] = false;
            }
        }
    }
    
    void init(void)
    {
        int in;
    
        in = 0;
        for (int i = 1; i <= n; ++i)
        {
            scanf("%s", g[i]+1);
            memset(vis[i], false, sizeof(vis[0][0])*(m+1));
            for (int j = 1; in<2 && j <= m; ++j)
                if(g[i][j] == 'S') si = i, sj = j, ++in;
                else if (g[i][j] == 'D') gi = i, gj = j, ++in;
        }
    }
    
    void solve(void)
    {
        finished = false;
        vis[si][sj] = true, dfs(si, sj, T);
        puts(finished ? "YES":"NO");
    }
    
    int main()
    {
        while (scanf("%d%d%d", &n, &m, &T), n || m || T)
        {
            init();
            solve();
        }
    
        return 0;
    }

    /**/

  • 相关阅读:
    linux常用命令笔记
    head first html与css
    多线程编程核心技术日记
    nio
    排序算法
    随笔
    数据库读写分离
    购物网站设计
    http
    servlet初始化
  • 原文地址:https://www.cnblogs.com/JMDWQ/p/2599725.html
Copyright © 2011-2022 走看看