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;}

原创粉丝点击