首页 > 其他 > 详细

HDU 1010 ------ Tempter of the Bone DFS

时间:2015-12-04 22:54:36      阅读:293      评论:0      收藏:0      [点我收藏+]

HDU 1010 ------ Tempter of the Bone  DFS  http://acm.hdu.edu.cn/showproblem.php?pid=1010

此题需用到奇偶剪枝: http://baike.baidu.com/link?url=bcOb04VaeuzcYxeO5_abULLkjxHcdnN_DKCddFzGJprYWJKNHGkDA2xRkOEt30TBP2PSqE99-oepiwH1CXWwr_ 

 

技术分享
/*HDU 1010 ------ Tempter of the Bone DFS*/
#include <cstdio>
#include <cstring>

int m, n, t, startx, starty, endx, endy;
char mapp[10][10];
bool visit[10][10], ans, flag;

/*求a-b的绝对值*/
int abs(int a, int b){
    if (a < b)
        return b - a;
    else
        return a - b;
}

/*搜索从i,j处走走到出口的结果 i j为横纵坐标 c为当前已走步数*/
void DFS(int i, int j, int c){
    if (flag || c > t || i <= 0 || i > n || j <= 0 || j > m)
        return;
    if (mapp[i][j] == D && c == t){
        ans = flag = 1;
        return;
    }
    int tmp = abs(i, endx) + abs(j, endy); //最短可到距离
    tmp = t - c - tmp; //t-c为剩余可走步数 减去最短距离为 剪纸
    if (tmp & 1) //若剪枝后tmp为奇数 一定不可到达
        return;

    //左边的点可以访问
    if (!visit[i - 1][j] && mapp[i - 1][j] != X){
        visit[i - 1][j] = true;
        DFS(i - 1, j, c + 1);
        visit[i - 1][j] = false;
    }
    //右边的点可以访问
    if (!visit[i + 1][j] && mapp[i + 1][j] != X){
        visit[i + 1][j] = true;
        DFS(i + 1, j, c + 1);
        visit[i + 1][j] = false;
    }
    //上边的点可以访问
    if (!visit[i][j - 1] && mapp[i][j - 1] != X){
        visit[i][j - 1] = true;
        DFS(i, j - 1, c + 1);
        visit[i][j - 1] = false;
    }
    //下边的点可以访问
    if (!visit[i][j + 1] && mapp[i][j + 1] != X){
        visit[i][j + 1] = true;
        DFS(i, j + 1, c + 1);
        visit[i][j + 1] = false;
    }
}

int main()
{
    //n行m列t步
    while (scanf("%d%d%d", &n, &m, &t) == 3 && (m + n + t)){
        int k = 0;
        memset(visit, 0, sizeof visit);
        //i,j取1是为了判别时数组不越界
        for (int i = 1; i <= n; ++i){
            scanf("%s", mapp[i]+1);
            for (int j = 1; j <= m; ++j){
                if (mapp[i][j] == X){
                    ++k; //记录墙的数量
                }
                else if (mapp[i][j] == S){
                    startx = i;  //记录起始点
                    starty = j;
                    visit[i][j] = true;
                }
                else if (mapp[i][j] == D){
                    endx = i; //记录终点
                    endy = j;
                }
            }//for(j)
        }//for(i)

        ans = flag = 0;
        if (n*m - k - 1 >= t) //总数-墙-起点 需大于等于 步数
            DFS(startx, starty, 0);
        if (ans)
            printf("YES\n");
        else
            printf("NO\n");
    }

    return 0;
}
View Code

 

HDU 1010 ------ Tempter of the Bone DFS

原文:http://www.cnblogs.com/tommychok/p/5020588.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!