HDU1010-Tempter of the Bone

http://acm.hdu.edu.cn/showproblem.php?pid=1010

dfs+奇偶性剪枝

#include<iostream>
using namespace std;
char gra[8][8];
bool mark[8][8]; 
int dir[4][2]={-1,0,1,0,0,-1,0,1},m,n,t,ok,si,sj,ei,ej;
int fun(int a,int b)
{
    return(a>b?a-b:b-a);
}
void dfs(int i,int j,int step)
{
    int k,p,q;
    if(ok==1)
       return;
    if(step==t)
    {
        if(i==ei&&j==ej)
           ok=1;
        return;
    }
    k=fun(i,ei)+fun(j,ej);
    if(step+k>t) 
       return;
    if(k%2!=(t-step)%2)
       return;
    for(k=0;k<4;k++)
    {
       p=i+dir[k][0];
       q=j+dir[k][1];
       if(p>=0&&p<m&&q>=0&&q<n&&gra[p][q]!='X'&&mark[p][q]==0)
       {
            mark[p][q]=1;
            dfs(p,q,step+1);
            mark[p][q]=0;
       }
    }
}
int main(void)
{
    while(cin>>m>>n>>t,m||n||t)
    {
        int i,j,walls=0;
        for(i=0;i<m;i++)
            for(j=0;j<n;j++)
            {
                cin>>gra[i][j];
                if(gra[i][j]=='S')
                   si=i,sj=j;
                else if(gra[i][j]=='D')
                   ei=i,ej=j;
                else if(gra[i][j]=='X')
                   walls++;
                mark[i][j] = 0;
            }
        if(n*m-walls<=t)
        {
           cout<<"NO"<<endl;
           continue;
        }
        ok=0;
        mark[si][sj]=1;
        dfs(si,sj,0);
        if(ok==1)
           cout<<"YES"<<endl;
        else
           cout<<"NO"<<endl;
    }
    return 0;
}

转载于:https://www.cnblogs.com/YogurtShen/archive/2012/08/29/2662275.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值