HDU 1010 Tempter of the Bone
来源:互联网 发布:ubuntu删除软件命令 编辑:程序博客网 时间:2024/06/05 13:21
#include <iostream>#include <cstring>#include <cmath>using namespace std;char map[9][9];int n, m, t, di, dj;int dir[4][2] = {{0,-1}, {0, 1}, {1, 0}, {-1, 0}};//四个方向bool escape;void dfs(int si, int sj, int cnt){ int i, temp; if (si>n || si<=0 || sj>m || sj<=0) //边界 return ; if (si == di && sj == dj && cnt == t) //成功逃脱,必须要恰好到达 { escape = true; return ; } // (t-cnt) 到终点还需要的步数 // abs(si-di)+abs(sj-dj) 当前点到终点的步数 temp = (t-cnt)-(abs(si-di)+abs(sj-dj)); if (temp < 0 || temp%2) return ; for (i=0; i<4; ++i) { if (map[si+dir[i][0]][sj+dir[i][1]] != 'X') { map[si+dir[i][0]][sj+dir[i][1]] = 'X'; //把走过的设置为墙壁,就不能走了 dfs(si+dir[i][0], sj+dir[i][1], cnt+1); if (escape) return ; map[si+dir[i][0]][sj+dir[i][1]] = '.'; //恢复现场 } } return ;}int main(){ int i, j, si, sj; while (cin >> n >> m >> t) { if (n==0 && m==0 && t==0) break; int wall = 0; for (i=1; i<=n; ++i) for (j=1; j<=m; ++j) { cin >> map[i][j]; if (map[i][j] == 'S') // (si, sj) 起始位置 { si = i; sj = j; } else if (map[i][j] == 'D') // (di, dj) 目标位置 { di = i; dj = j; } else if (map[i][j] == 'X') ++wall; //墙壁数量 } if (n*m-wall <= t) // (n*m-wall) 表示一共可以走的步数 { cout << "NO" << endl; continue; } escape = false; map[si][sj] = 'X'; dfs(si, sj, 0); if (escape) cout << "YES" << endl; else cout << "NO" << endl; } return 0;}