hdu 1010 Tempter of the Bone (dfs+剪枝)

本文介绍了一个使用深度优先搜索(DFS)解决迷宫问题的算法,并通过奇偶剪枝优化搜索过程,确保在指定步数内到达目的地。文章详细解释了奇偶剪枝原理及其实现。

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

题目传送门



简单的dfs和剪枝,卡了一天才过。

注意:是t时刻恰好到达door,不能提前也不能滞后。

还有一个小技巧叫做奇偶剪枝,如下:

从一个点a到另一个点b走的步数最少应该是abs(ax-bx)+abs(ay-by);即上下和左右都向目标的方向走,每一步都更近,示意如下:

s    
|    
|    
|    
+e
 

然而如果选择非最短步数,即有的步数是远离目标的,那么总步数减去最短步数(即abs(ax-bx)+abs(ay-by))必定为偶数(因为它远离之后还要再靠近一步)。

这样可以直接判断出要求的时间t(即步数)是否符合这个规律,如果不符合直接NO,退出。

更直观的解释:

可以把map看成这样:
01 0 1 0 1
10 1 0 1 0
01 0 1 0 1
10 1 0 1 0
01 0 1 0 1
从为0 的格子走一步,必然走向为1 的格子
从为1 的格子走一步,必然走向为0 的格子
即:
0 ->1或1->0必然是奇数步
0->0 走1->1必然是偶数步

所以当遇到从 0 走向 0 但是要求时间是奇数的,或者, 从 1 走向 0 但是要求时间是偶数的 都可以直接判断不可达!


代码:




#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
#include<stdlib.h>
#include<cstdlib>
#include<math.h>
#define L long long
#define max(a,b) a>b?a:b;
#define min(a,b) a>b?b:a;
using namespace std;

char map[9][9];
int v[9][9]={0};
int n,m,t;
int ans=0,flag=0;
int dx,dy;

void dfs(int s,int sx,int sy)
{
    if(ans)return ;
    if(s==t&&sx==dx&&sy==dy)
    {
        ans=1;return ;
    }
    if(s>t)
        return ;
    if(!v[sx+1][sy]&&map[sx+1][sy]!='X')
    {
        v[sx+1][sy]=1;
        dfs(s+1,sx+1,sy);
        v[sx+1][sy]=0;
    }
    if(!v[sx][sy+1]&&map[sx][sy+1]!='X')
    {
        v[sx][sy+1]=1;
        dfs(s+1,sx,sy+1);
        v[sx][sy+1]=0;
    }
    if(!v[sx-1][sy]&&map[sx-1][sy]!='X')
    {
        v[sx-1][sy]=1;
        dfs(s+1,sx-1,sy);
        v[sx-1][sy]=0;
    }
    if(!v[sx][sy-1]&&map[sx][sy-1]!='X')
    {
        v[sx][sy-1]=1;
        dfs(s+1,sx,sy-1);
        v[sx][sy-1]=0;
    }
}
void p()
{
    for(int i=0;i<=n+1;i++)
    {
        for(int j=0;j<=1+m;j++)
        {
            printf("%c",map[i][j]);
        }
        printf("\n");
    }
}
int main()
{
    for(int i=0;i<=9;i++)
    {
        map[i][0]='X';map[0][i]='X';
    }
    while(scanf("%d%d%d",&n,&m,&t),n,m,t)
    {
int sx,sy;
        int k=0;
        ans=0;
        memset(v,0,sizeof(v));
        getchar();
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                scanf("%c",&map[i][j]);
                if(map[i][j]=='X')k++;
                if(map[i][j]=='D')
                {
                    dx=i;dy=j;
                }
                if(map[i][j]=='S')
                {
                    sx=i;sy=j;
                    v[i][j]=1;
                }
            }
            getchar();
        }
        for(int i=0;i<=n;i++)
        {
            map[i][m+1]='X';
        }
        for(int i=0;i<=m;i++)
        {
            map[n+1][i]='X';
        }
        //p();
        if(n*m-k-1>=t)dfs(0,sx,sy);
    int temp=abs(sx-dx)+abs(sy-dy);
    temp=t-temp;
    if(temp&1)printf("NO\n");//奇偶剪枝
        else if(ans)
            printf("YES\n");
        else printf("NO\n");
    }
}



现假设起点为(sx,sy),终点为(ex,ey),给定t步恰好走到终点,
 
s    
|    
|    
|    
+e
 
内容概要:《2024年中国城市低空经济发展指数报告》由36氪研究院发布,指出低空经济作为新质生产力的代表,已成为中国经济新的增长点。报告从发展环境、资金投入、创新能力、基础支撑和发展成效五个维度构建了综合指数评价体系,评估了全国重点城市的低空经济发展状况。北京和深圳在总指数中名列前茅,分别以91.26和84.53的得分领先,展现出强大的资金投入、创新能力和基础支撑。低空经济主要涉及无人机、eVTOL(电动垂直起降飞行器)和直升机等产品,广泛应用于农业、物流、交通、应急救援等领域。政策支持、市场需求和技术进步共同推动了低空经济的快速发展,预计到2026年市场规模将突破万亿元。 适用人群:对低空经济发展感兴趣的政策制定者、投资者、企业和研究人员。 使用场景及目标:①了解低空经济的定义、分类和发展驱动力;②掌握低空经济的主要应用场景和市场规模预测;③评估各城市在低空经济发展中的表现和潜力;④为政策制定、投资决策和企业发展提供参考依据。 其他说明:报告强调了政策监管、产业生态建设和区域融合错位的重要性,提出了加强法律法规建设、人才储备和基础设施建设等建议。低空经济正加速向网络化、智能化、规模化和集聚化方向发展,各地应找准自身比较优势,实现差异化发展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值