hdu 1010 Tempter of the Bone

3 篇文章 0 订阅

这个题一开始是想用BFS来做的,可是提交的时候并没有通过,然后仔细想了想,才发现题意要求是在时刻t恰好到达终点,不能提前,这样的话用BFS就不太好操作了,所以最后改用DFS进行操作。

  用DFS的话就要用到剪枝,这里有两个剪枝:

  ①最优性剪枝:奇偶性剪枝。把原图按照x+y的奇偶性变成01矩阵,那么00,11之间一定距离偶数步,01之间一定距离奇数步,那么我们只需检查终点和当前点以及所剩步数的奇偶性就可以进行剪枝。

  ②可行性剪枝:当前点到达终点至少需要的步数为abs(x-en.x)+abs(y-en.y)如果当前所剩的步数小于这个值那么这个路线肯定是不可行的,剪枝。

要知道,一旦找到一条可行的路径后,就不需要在找下去了。对于人的移动我们可以通过dxdy两个数组来进行控制,运用数组的好处在于,它可以之间通过一个循环来实现,减少了代码的变成复杂度。


#include <cstdio>
#include <cmath>
#include <iostream>

using namespace std;

struct note
{
    int x,y;
}st,en;

int n,m,t,q;
int dx[4]={1,-1,0,0},dy[4]={0,0,1,-1};
char f[10][10];

void can(int x,int y,int i)
{
    if (f[x][y]=='D') {if (i==t) q=1; return; }
    if (i==t) return;
    if (abs(en.x-x)+abs(en.y-y)>t-i) return;
    if (abs((en.x+en.y)%2-(x+y)%2)!=(t-i)%2) return;
    if (q==1) return;
    f[x][y]='X';
    for (int j=0;j<4;j++)
        if ((x+dx[j]>=0)&&(x+dx[j]<n)&&(y+dy[j]>=0)&&(y+dy[j]<m)&&(f[x+dx[j]][y+dy[j]]!='X')) can(x+dx[j],y+dy[j],i+1);
    f[x][y]='.';

}

int main()
{
    while (scanf("%d%d%d",&n,&m,&t)!=EOF)
    {
        if (!n) break;
        for (int i=0;i<n;i++)
        {
            scanf("%s",f[i]);
            for (int j=0;j<m;j++)
            {
                if (f[i][j]=='S') {st.x=i; st.y=j;f[i][j]='X'; }
                else if (f[i][j]=='D') {en.x=i; en.y=j; }
            }
        }
        q=0;
        can(st.x,st.y,0);
        if (q) printf("YES\n"); else printf("NO\n");
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值