hdu1010

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1010

先说下这个题的坑:
      1)要求是正好的时间到达,因为这个坑了很多次WA。。
      2)减枝。一个是算最短路径都大于给定时间的,一个是奇偶性的问题,比如(0,0)点到了(1,1)要走偶数步,而到(0,1)要走奇数步,判断一下题目给的时间是否符合,还有一个是dfs写的时候是到达了门那个点就要退出。。 三个剪枝缺一不可。。。

代码:

#include <cstdio>
#include <cstring>


int n,m,t,ans;
int startx,starty,endx,endy;
char map[10][10];

int v[10][10];
int next[5][2] = { {-1,0}, //上
                   {0,1},  //right
                   {1,0},  //down
                   {0,-1}  // left
};
int flag;
int Abs(int n)

{
    return n > 0 ? n : -n;
}
void dfs(int x,int y,int dis)

{
    if(x == endx && y == endy)
    {
        if(dis == t)
            flag = 1;
        return ;
    }

    for(int i = 0;i < 4;++i)
    {
        int tx = x + next[i][0];
        int ty = y + next[i][1];
        if(tx < 0 || tx > n - 1 || ty < 0 || ty > m - 1 || map[tx][ty] == 'X')
            continue;
        if(!v[tx][ty]){
            v[tx][ty] = 1;
            dfs(tx,ty,dis + 1);
            v[tx][ty] = 0;
            if(flag)
                return ;
        }
    }
}
int main()

{
    while(~scanf("%d%d%d",&n,&m,&t),n + m + t)
    {
        flag = 0;
        memset(v,0,sizeof v);
        int cnt = 0;
        for(int i = 0; i < n; ++i)
            scanf("%s",map[i]);
        for(int i = 0; i < n; ++i)
            for(int j = 0; j < m; ++j)
                if(map[i][j] == 'S')
                {
                    startx = i;
                    starty = j;
                }
                else if(map[i][j] == 'D')
                {
                    endx = i;
                    endy = j;
                }
        if(Abs(startx - endx) + Abs(starty - endy) > t || (startx+starty+endx+endy + t) % 2 == 1)
        {
            printf("NO\n");
            continue;
        }
        v[startx][starty] = 1;
        dfs(startx,starty,0);
        if(flag)
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}

你可能感兴趣的:(ACM,DFS,剪枝)