HDU 1010
深搜基础题,用到了奇偶剪枝。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; int N, M, T; char map[10][10]; int sx, sy, ex, ey; int flag; int dir[4][2] = {1, 0, 0, 1, -1, 0, 0, -1}; void dfs(int x, int y, int time) { if(time == T) { if(x == ex && y == ey) flag = 1; return; } else if(x == ex && y == ey) return; if(flag) return; else { int i; for(i = 0; i < 4 && !flag; i++) { int tx = x + dir[i][0]; int ty = y + dir[i][1]; if(tx >= 1 && tx <= N && ty >= 1 && ty <= M && map[tx][ty] != 'X') { map[tx][ty] = 'X'; dfs(tx, ty, time + 1); map[tx][ty] = '.'; } } } } int main () { //freopen("input.txt", "r", stdin); while(~scanf("%d %d %d", &N, &M, &T) && N + M + T) { getchar(); int i, j; for(i = 1; i <= N; i++) { for(j = 1; j <= M; j++) { scanf("%c", &map[i][j]); if(map[i][j] == 'S') { sx = i; sy = j; map[i][j] = 'X'; } else if(map[i][j] == 'D') { ex = i; ey = j; } } getchar(); } if(abs(sx - ex) + abs(sy - ey) > T || (sx + sy + ex + ey + T) % 2) { //剪枝 printf("NO\n"); continue; } flag = 0; dfs(sx, sy, 0); if(flag) printf("YES\n"); else printf("NO\n"); } return 0; }