zoukankan      html  css  js  c++  java
  • Hdu1010Tempter of the Bone 深搜+剪枝

    题意:输入x,y,t.以及一个x行y列的地图,起点‘S’终点‘D’地板‘.’墙壁‘X’;判断能否从S正好走t步到D。

    题解:dfs,奇偶性减枝,剩余步数剪枝。

    ps:帮室友Debug的题:打错了两个字母。题目看错。没有初始化map。orz ...不过我dfs也不熟,更别说剪枝了。

    //#include <bits/stdc++.h>
    #define  _CRT_SECURE_NO_WARNINGS
    #include <iostream>
    #include <cstdio>
    #include <string>
    #include <string.h>
    #include <algorithm>
    using namespace std;
    #define LL long long
    int n, m, T;
    int si, sj, ei, ej;
    char a[10][10];
    int map[10][10];
    int dir[4][2] = { { 1,0 },{ -1,0 },{ 0,1 },{ 0,-1 } };
    int check(int i, int j, int t) {
        if (i<0 || i >= n || j<0 || j >= m || map[i][j] || a[i][j] == 'X') return false;
    
        return true;
    }
    bool dfs(int i, int j, int t) {
        
        if (i == ei&&j == ej&&t==T) return true;
        if (t>=T) return false;
        map[i][j] = 1;
        for (int k = 0; k<4; k++) {
            int di = i + dir[k][0];
            int dj = j + dir[k][1];
            if (!check(di, dj, t + 1)) continue;
            if (dfs(di, dj, t + 1))
                return true;
            map[di][dj] = 0;
        }
        return false;
    }
    int main() {
        while (~scanf("%d%d%d", &n, &m, &T)) {
            if (n == 0 && m == 0 && T == 0) break;
            memset(map, 0, sizeof(map));
            for (int i = 0; i<n; i++)
                scanf("%s", a[i]);
            int ok = 0;
            for (int i = 0; i<n; i++) {
                for (int j = 0; j<m; j++) {
                    if (a[i][j] == 'D') {
                        ei = i; ej = j;
                        ok++;
                    }
                    if (a[i][j] == 'S') {
                        si = i; sj = j;
                        ok++;
                    }
                    if (ok == 2) break;
                }
                if (ok == 2) break;
            }
            if ((T - (abs(ei - si) + abs(ej - sj))) % 2 || (T - (abs(ei - si) + abs(ej - sj)))<0) printf("NO
    ");
            else if (dfs(si, sj,0)) printf("YES
    ");
            else printf("NO
    ");
        }
        return 0;
    }
    成功的路并不拥挤,因为大部分人都在颓(笑)
  • 相关阅读:
    你想了解数据库吗,进来瞧一瞧吧,详细的数据库解读
    MySQL8.0-INFORMATION_SCHEMA增强
    工作总结:涉及数据库、软件测试等内容
    MySQL高级-MySQL锁
    年轻就该多尝试,教你20小时Get一项新技能
    “TensorFlow 开发者出道计划”全攻略,玩转社区看这里!
    MySQL数据库高级操作(图文详解)
    JAVA RMI helloworld入门
    JAVA8 十大新特性详解
    Java 8 Lambda表达式探险
  • 原文地址:https://www.cnblogs.com/SuuT/p/8522505.html
Copyright © 2011-2022 走看看