【解题报告】hdu1010 Tempter of the Bone

来源:互联网 发布:php 订阅号自定义菜单 编辑:程序博客网 时间:2024/04/29 08:38

  原题请看这里。

  题目是一道迷宫类问题,独特之处在于,不需要尽少步数到达目标点,而必须经过特定步数到达终点(庙门会在特定时间开启,而且只有一瞬间)。另外,每个点只能走一次。

  由于只需要一条符合条件的路径到达目标点即可,所以采用DFS比较好。考虑到步数0 < T < 50,粗略估计(4^T),即便一些走过的点不能再走,时间复杂度仍然难以接受。

  考虑剪枝,一方面,一个显而易见的事实是,如果剩下的步数小于当前点到目标点的最小距离,则一定不能到达。

  另外,在开始DFS前,有两个判定:

     1.  如果T大于点的个数,则不能到达。(不知道会不会有这样的数据)

     2. 奇偶剪枝。图中,从0点到任意一个0点需要偶数步,到任意一个1点,需要奇数步。所以可以通过开始点,目标点与T的情况,直接进行判断。

  

                          

#include<stdio.h>#include<string.h>#include<stdlib.h> //没加一系列头文件居然是Wa而不是Ceconst int dx[]= {0,0,0,1,-1},dy[]= {0,1,-1,0,0};int map[10][10],used[10][10],sx,sy,tx,ty,n,m,t;int dfs(int x,int y, int step){    int i,xx,yy;    if (step==t)    {        if (x==tx&&y==ty)            return 1;        return 0;    }    if (t-step<abs(tx-x+ty-y)) return 0;//剪枝    for (i=1; i<=4; i++)    {        xx=x+dx[i];        yy=y+dy[i];        if (map[xx][yy]&&(!used[xx][yy]))        {            used[xx][yy]=1;            if(dfs(xx,yy,step+1)) return 1;            used[xx][yy]=0;        }    }    return 0;}int main(){    int i,j;    while (scanf("%d%d%d",&n,&m,&t)&&(n||m||t))    {        getchar();        memset(map,0,sizeof(map));        memset(used,0,sizeof(used));        for (i=1; i<=n; i++)        {            for (j=1; j<=m; j++)                switch(getchar())                {                case 'S':                {                    sx=i;                    sy=j;                    break;                }                case 'D':                {                    tx=i;                    ty=j;                    map[i][j]=1;                    break;                }                case '.':                {                    map[i][j]=1;                    break;                }                case 'X':                    ;                default :                    ;                };            getchar();        }        if (((abs(sx-tx)+abs(sy-ty))%2!=t%2)||!dfs(sx,sy,0)) printf("NO\n"); //预判        else  printf("YES\n");    }    return 0;}


  

原创粉丝点击