HDOJ_1010 Tempter of the Bone

程序采用递归方式:

源码:

#include<iostream>
#include<cmath>
using namespace std;
#define MAX 7
char a[MAX][MAX];
int d[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
void f(int x_b,int y_b,int x_e,int y_e,int t);
bool flag=false;
int N,M,T;
int main()
{
    int i,j;
    int x_b,y_b,x_e,y_e,sum=0;
    while(cin>>N>>M>>T && (N!=0 ||M!=0)||(T!=0))
    {
        flag=false;
        sum=0;
        for(i=0;i<N;i++)
            cin>>a[i];
        for(i=0;i<N;i++)
            for(j=0;j<M;j++)
            {
                if(a[i][j]=='S')
                {
                    x_b=i;
                    y_b=j;
                }
                else if(a[i][j]=='D')
                {
                    x_e=i;
                    y_e=j;
                }
                else if(a[i][j]=='X')
                    sum++;
            }
        if((N*M-sum)<=T) //剪枝,当可走的路小于时间限制是为NO
        {
            cout<<"NO"<<endl;
            continue;
        }
        else
        {
            a[x_b][y_b]='X';
            f(x_b,y_b,x_e,y_e,0);
            if(flag)
                cout<<"YES"<<endl;
            else
                cout<<"NO"<<endl;
        }
    }
    return 0;
}
void f(int x_b,int y_b,int x_e,int y_e,int t)
{
    int i,x,y;
    if((x_b==x_e) && (y_b==y_e) &&(t==T))
        flag=true;
    if(flag)    //剪枝,否则超时,不加的时候会循环所有可以走的路,直到遍历完全,加上之后在找到一条路后直接返回。
        return;
    int temp=(T-t)-abs(x_b-x_e)-abs(y_b-y_e); //剪枝
    if(temp<0||temp&1)
        return;
    for(i=0;i<4;i++)
    {
        x=x_b+d[i][0];
        y=y_b+d[i][1];
        if(t<T)
        {
            if(x<N && x>=0 && y>=0 && y<M)
            {   
                if(a[x][y]!='X')
                {       
                    a[x][y]='X';
                    f(x,y,x_e,y_e,t+1);
                    a[x][y]='.';
                }
            }
        }
    }
}

需要注意地方:函数 abs和fabs都是求数的绝对值,原型:int abs(int x)求整型x的绝对值;double fabs(double x)求x的绝对值;在vc环境下,如果是对整型数求绝对值,虽然都可以通过,建议只用前者,后者在别的编译器上可能出现函数重载错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值