ZOJ 2110 Tempter of the Bone(DFS)

本文介绍了一种解决迷宫逃脱问题的方法,其中迷宫大小为N×M,门将在第T秒开启。算法通过深度优先搜索(DFS)来探索路径,并在时间约束下判断是否能够到达门的位置。若能,则输出YES;否则,输出NO。算法还考虑了路径变化和剪枝以避免超时。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

点我看题目

题意 : 一个N×M的迷宫,D是门的位置,门会在第T秒开启,而开启时间小于1秒,问能否在T秒的时候到达门的位置,如果能输出YES,否则NO。

思路 :DFS一下就可以,不过要注意下一终止条件再判断一下时间,还有因为题目中要求走过的路要变成墙,所以每次走的时候要注意一下把路变成墙,但是如果你不走这条路了,要记得变回来。还有这个题必须剪枝,否则超时超到疯啊,DFS函数中那个剪枝不怎么好想,T-t代表的是在当前位置还需要T-t步路。而fabs(ex-x)+fabs(ey-y)指的是当前位置离终点最短还有着些步数,如果两者之差不小于0的话,T-t应该等于fabs(ex-x)+fabs(ey-y)+s,这个s,如果再扩展的话增加的长宽必定是偶数,所以奇数是不可达的

#include <stdio.h>
#include <math.h>
#include <iostream>
#include <string.h>

using namespace std ;

int N,M,T ;
char mapp[9][9] ;
int mp[9][9];
int sx,sy ;
int ex,ey ;
bool flag ;
int ans;
int dire[4][2] = {{0,-1},{0,1},{1,0},{-1,0}} ;

void DFS(int x,int y,int t)
{
    if(x == ex && y == ey&&t==T)
    {
        flag = true ;
        return  ;
    }
    int temp = (T-t)-fabs(ex-x)-fabs(ey-y) ;
    if(temp < 0 || temp%2) return ;
    for(int i = 0 ; i < 4 ; i++)
    {
        int xx = x+dire[i][0] ;
        int yy = y+dire[i][1] ;
        if(xx >= 0 && xx < N && yy >= 0 && yy < M && mp[xx][yy])
        {
            mp[xx][yy] = 0 ;
            DFS(xx,yy,t+1) ;
            if(flag) return ;
            mp[xx][yy] = 1 ;
        }
    }
}
int main()
{
    while(scanf("%d %d %d",&N,&M,&T)!=EOF)
    {
        getchar();
        if(N == 0 && M == 0 && T == 0) break ;
        memset(mp,0,sizeof(mp)) ;
        flag = false ;
        int wall = 0 ;
        for(int i = 0 ; i < N ; i++)
        {
            scanf("%s",mapp[i]);
            for(int j = 0 ; j < M ; j++)
            {
                if(mapp[i][j] == 'S')
                    sx = i ,sy = j ;
                else if(mapp[i][j] == 'D')
                {
                    ex = i,ey = j ;
                    mp[i][j] = 1 ;
                }
                else if(mapp[i][j] == '.')
                    mp[i][j] = 1 ;
                else wall ++ ;
            }
        }
        if(N*M-wall <= T)
        {
            printf("NO\n") ;
            continue ;
        }
        mp[sx][sy] = 0 ;
        DFS(sx,sy,0) ;
        if(flag)
            printf("YES\n") ;
        else printf("NO\n") ;
    }
    return 0 ;
}
View Code

 

转载于:https://www.cnblogs.com/luyingfeng/p/3627058.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值