(1010)HDU

题意:在N*M的图下。问你从S到D是够可以到达在第T秒的时候

解决方法:DFS

注意:两次剪枝 

#include<iostream>

#include<cstdio>
#include<string.h>
#include<string>
#include<stack>
#include<set>
#include<algorithm>
#include<cmath>
#include<vector>
#include<map>


#define ll __int64
#define lll unsigned long long
#define MAX 50009
#define eps 1e-8
#define INF 0xfffffff




using namespace std;


char ma[9][9];
int n,m,t;
int dx,dy;
int sx,sy;
int flag;
int dir[4][2] = {0,-1,0,1,1,0,-1,0};


void dfs(int x,int y,int cnt)
{
    int temp;
    if(x<=0||x>n||y<=0||y>m) return ;
    if(x==sx&&y==sy&&cnt==t)
    {
        flag = 1;
        return ;
    }
    //t-cnt是实际还需要的步数
    //fabs(x-sx)+fabs(y-sy) 当前点到目标点的距离
    temp = (t-cnt) - (fabs(x-sx)+fabs(y-sy));
    if(temp<0||temp%2)return ;//如果时间不够或者为奇数一定不可以。
    for(int i = 0; i<4; i++)
    {
        int xx = x + dir[i][0];
        int yy = y + dir[i][1];
        if(ma[xx][yy]!='X')
        {
            ma[xx][yy] = 'X';
            dfs(xx,yy,cnt+1);
            if(flag)return ;
            ma[xx][yy] = '.';
        }
    }
    return ;
}


int main()
{
    int i,j;
    while(~scanf("%d%d%d",&n,&m,&t))
    {
        if(n==0&&m==0&&t==0)break;
        int wall = 0;
        flag = 0;
        getchar();
        for(i = 1; i<=n; i++)
        {
            for(j = 1; j<=m; j++)
            {
                scanf("%c",&ma[i][j]);
                if(ma[i][j]=='S')
                {
                    dx = i;
                    dy = j;
                }
                else if(ma[i][j]=='D')
                {
                    sx = i;
                    sy = j;
                }
                else if(ma[i][j]=='X')
                {
                    wall++;
                }
            }
            getchar();
        }
        if(m*n-wall<=t)
        {
            puts("NO");
            continue;
        }
        ma[dx][dy] = 'X';
        dfs(dx,dy,0);
        if(flag)
            puts("YES");
        else
            puts("NO");
    }
    return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值