HDU 1010--Tempter of the Bone

題目:這是題目

題意:一隻狗狗在一個迷宮裏面要從門出去,但是門只在第T時間開一次,狗狗一定要在這個時間點出去,並且狗狗走過的路會消失,問是否狗狗能從門走出迷宮?

思路:這個題爆搜會T,要用奇偶剪枝,即T和狗狗到門的曼哈頓距離的奇偶一定要一樣。

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <math.h>
using namespace std;

const int MAX = 10;
int ti;

int n, m, t;
char _map[MAX][MAX];
bool visit[MAX][MAX];
int d[MAX][MAX];
int x[4] = {0, 1, 0, -1};
int y[4] = {-1, 0, 1, 0};

int dis(int x1, int y1, int x2, int y2) {
    return (abs(x2 - x1) + abs(y2 - y1));
}//計算曼哈頓距離

bool dfs(int xx, int yy, int time) {
    if (_map[xx][yy] == 'D' && time == t) {
        return true;
    }//正好是t時刻到門則能到達
    else {
        for (int i = 0; i < 4; i++) {
            int xi = xx + x[i];
            int yi = yy + y[i];
//            cout << "$$ " << xi << " " << yi << endl;
            if (xi >= 0 && xi < n && yi >= 0 && yi < m && !visit[xi][yi]) {
//                cout << "ok " << xi << " " << yi << endl;
                time += 1;
                visit[xi][yi] = true;
                if (dfs(xi, yi, time)) {
                    return true;
                }
                time -= 1;
                visit[xi][yi] = false;
            }
        }
    }
    return false;

}


int main() {
    while(scanf("%d%d%d", &n,&m,&t) != EOF) {
        if (n == 0 && m == 0 && t == 0)
            break;
        getchar();
        int sx, sy, ex, ey;
        ti = 100;
        memset(visit, false, sizeof(visit));
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                scanf("%c", &_map[i][j]);
                if (_map[i][j] == 'S') {
                    sx = i;
                    sy = j;
                    visit[sx][sy] = true;
                }
                else if (_map[i][j] == 'D') {
                    ex = i;
                    ey = j;
                }
                else if (_map[i][j] == 'X')
                    visit[i][j] = true;
            }
            getchar();
        }

        if (dis(sx, sy, ex, ey) % 2 == t % 2) {//剪枝
            if (dfs(sx, sy, 0))
                printf("YES\n");
            else
                printf("NO\n");
        }
        else {
            printf("NO\n");
        }
    }
    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章