DFS+剪枝 hdu1010 Tempter of the Bone

一个地图,不允许走已经走过的,告诉起点,问是否能在第T时间恰好走到终点


其实就是一个DFS,只是有两个地方要注意

1.vis刚开始标记后,在退出DFS的时候要去掉标记

2.一定要剪枝,否则会超时


剪枝可以通过奇偶剪枝,算出起点到重点的曼哈顿距离

然后看曼哈顿距离的奇偶性是否和T的奇偶性一样,如果一样就有可能到,如果不一样,必然不能到,直接输出返回


#include<cstdio>
#include<cmath>
#include<cstring>
#include<queue>
#include<cctype>
#include<stack>
#include<vector>
#include<functional>
#include<algorithm>

using namespace std;
typedef long long LL;
typedef pair<int, int> PII;

const int MX = 10 + 5;
const int INF = 0x3f3f3f3f;

int m, n;
int vis[MX][MX];
char S[MX][MX];
int dist[][2] = {{1, 0}, { -1, 0}, {0, 1}, {0, -1}};

bool DFS(int x, int y, int T) {
    if(T == 0) {
        if(S[x][y] == 'D') return true;
        return false;
    }

    vis[x][y] = 1;
    for(int k = 0; k < 4; k++) {
        int nx = x + dist[k][0];
        int ny = y + dist[k][1];
        if(nx < 1 || nx > m || ny < 1 || ny > n) continue;
        if(S[nx][ny] == 'X' || vis[nx][ny]) continue;

        if(DFS(nx, ny, T - 1)) return true;
    }
    vis[x][y] = 0;
    return false;
}

int main() {
    int T;
    while(~scanf("%d%d%d", &m, &n, &T), m + n) {
        PII FST(-1, -1);
        for(int i = 1; i <= m; i++) {
            scanf("%s", S[i] + 1);
            for(int j = 1; j <= n; j++) {
                if(S[i][j] == 'S') FST = PII(i, j);
            }
        }

        int temp = abs(FST.first - END.first) + abs(FST.second - END.second);
        if(FST.first == -1 || T % 2 != temp % 2) {
            printf("NO\n");
            continue;
        }


        memset(vis, 0, sizeof(vis));
        printf("%s\n", DFS(FST.first, FST.second, T) ? "YES" : "NO");
    }
    return 0;
}


你可能感兴趣的:(DFS+剪枝 hdu1010 Tempter of the Bone)