奇偶性剪枝--hdu1010 Tempter of the Bone

给定地图,n * m,S为起点,D为终点,X为墙壁,求是否能刚好在t秒时到达出口。


#include <iostream>

#include <cstdio>

#include <queue>

#include <cstring>

#include <cstdlib>

using namespacestd;

const int maxn =8;

char mp[maxn][maxn];

int n,m,t;

bool vis[maxn][maxn];

bool escape = false;

struct point{

    int x,y;

};

point s,e;

point pre[maxn][maxn];

void dfs(int x,int y,int d)

{

    if (d ==t){

        if(x ==e.x && y ==e.y)escape = true;

        return ;

    }

    mp[x][y] =' ';

    if(x +1 < n &&mp[x + 1][y] =='.')  {dfs(x +1, y, d + 1);if(escape)return;}

    if(x -1 >= 0 &&mp[x - 1][y] =='.')  {dfs(x -1, y, d + 1);if(escape)return;}

    if(y +1 < m &&mp[x][y + 1] =='.')  {dfs(x, y +1, d + 1);if(escape)return;}

    if(y -1 >= 0 &&mp[x][y - 1] =='.')  {dfs(x, y -1, d + 1);if(escape)return;}

    mp[x][y] ='.';

}

int main()

{

    while (scanf("%d%d%d",&n,&m,&t) != EOF) {

        if(n ==0 && m ==0 && t ==0) return0;

        getchar();

        escape =false;

        memset(mp,0, sizeof(mp));

        int wall =0;

        for (int i =0; i < n; i ++) {

                scanf("%s",mp[i]);

            for (int j =0; j < m; j ++){

                if(mp[i][j] =='S') {s.x = i,s.y = j;mp[i][j] = '.';}

                elseif(mp[i][j] =='D') {e.x = i,e.y = j;mp[i][j] = '.';}

                elseif(mp[i][j] =='X') wall++;

            }

        }

        bool fg = ((s.x +s.y +e.x +e.y) %2 == t %2 )? 1 :0;//奇偶性剪枝

        if(wall +t + 1 >n * m) fg =false;//无路可走

        if(!fg) {printf("NO\n");continue;}

        memset(vis,0, sizeof(vis));

        dfs(s.x,s.y,0);

        if (fg &&escapeprintf("YES\n");

        elseprintf("NO\n");

    }

    return0;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值