HDU 1429 胜利大逃亡(续) (BFS+二进制)

微信支付V2,jsapi支付拉起收银台报错:调用支付JSAPI缺少参数:total_fee 拉起收银台报错 阅读详情

胜利大逃亡(续)
Crawling in process... Crawling failed Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

Description

Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)……

这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带锁的门,钥匙藏在地牢另外的某些地方。刚开始Ignatius被关在(sx,sy)的位置,离开地牢的门在(ex,ey)的位置。Ignatius每分钟只能从一个坐标走到相邻四个坐标中的其中一个。魔王每t分钟回地牢视察一次,若发现Ignatius不在原位置便把他拎回去。经过若干次的尝试,Ignatius已画出整个地牢的地图。现在请你帮他计算能否再次成功逃亡。只要在魔王下次视察之前走到出口就算离开地牢,如果魔王回来的时候刚好走到出口或还未到出口都算逃亡失败。
 

Input

每组测试数据的第一行有三个整数n,m,t(2<=n,m<=20,t>0)。接下来的n行m列为地牢的地图,其中包括:

. 代表路
* 代表墙
@ 代表Ignatius的起始位置
^ 代表地牢的出口
A-J 代表带锁的门,对应的钥匙分别为a-j
a-j 代表钥匙,对应的门分别为A-J

每组测试数据之间有一个空行。
 

Output

针对每组测试数据,如果可以成功逃亡,请输出需要多少分钟才能离开,如果不能则输出-1。
 

Sample Input

     
4 5 17 @A.B. a*.*. *..*^ c..b* 4 5 16 @A.B. a*.*. *..*^ c..b*
 

Sample Output

     
16 -1
          

思路:用一个key变量的二进制表示钥匙的拥有情况,如key=5,二进制为101,则有a和c钥匙。方便vis数组第三维的标记。再用一个flag数组表示拥有的钥匙,方便走路时判断。

代码如下:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
struct node{
	int x,y,step;
	int key;//转化为二进制表示拥有的钥匙,如:第一位为1则有A门的钥匙 
	bool flag[12];//flag[i]表示拥有的钥匙 
};
int n,m,t;
char mp[22][22];
bool vis[22][22][1050];//第三维表示拥有的钥匙 
int dir[4][2]={1,0,-1,0,0,-1,0,1};
int a[11]={1,2,4,8,16,32,64,128,256,512};//每拥有一把钥匙要在key上加的值 
bool judge(int xx,int yy,int k){
	if(xx>n||xx<1||yy>m||yy<1)return 0;
	if(mp[xx][yy]=='*')return 0;
	if(vis[xx][yy][k])return 0;
	return 1;
}
int bfs(int stx,int sty){
    queue<node>q;
	node e1;
	e1.x=stx;e1.y=sty;e1.step=0;e1.key=0;
	for(int i=0;i<12;i++)//初始化 
	e1.flag[i]=0;
	vis[stx][sty][0]=1;
	q.push(e1);
	while(!q.empty()){
		node e2=q.front();
		q.pop();
		if(mp[e2.x][e2.y]=='^')return e2.step;
		for(int i=0;i<4;i++){
			node e3=e2;
			e3.x=e3.x+dir[i][0];
			e3.y=e3.y+dir[i][1];
			e3.step=e3.step+1;
			if(judge(e3.x,e3.y,e3.key)){
				if(mp[e3.x][e3.y]>='a'&&mp[e3.x][e3.y]<='j'){
					if(e3.flag[mp[e3.x][e3.y]-'a']==0){//如果未拿过这把钥匙,则需要改变key和flag数组的值 
					e3.key+=a[mp[e3.x][e3.y]-'a'];
					e3.flag[mp[e3.x][e3.y]-'a']=1;
					}
					q.push(e3);
					vis[e3.x][e3.y][e3.key]=1;
				}
				else if(mp[e3.x][e3.y]>='A'&&mp[e3.x][e3.y]<='J'){
					if(e3.flag[mp[e3.x][e3.y]-'A']){
						q.push(e3);
						vis[e3.x][e3.y][e3.key]=1;
					}
				}
				else{
					q.push(e3);
					vis[e3.x][e3.y][e3.key]=1;
				}
			}
		}
	} 
	return -1;
}
int main(){
	int i,j,stx,sty;
	while(scanf("%d%d%d",&n,&m,&t)!=EOF){
		memset(vis,0,sizeof(vis));//初始化 
		for(i=1;i<=n;i++){
		getchar();
		for(j=1;j<=m;j++){
		   scanf("%c",&mp[i][j]);
		   if(mp[i][j]=='@'){
   			stx=i;sty=j;
   		   }	
		}
	}
	int ans=bfs(stx,sty);
	if(ans>=t)ans=-1;
	cout<<ans<<endl;
	}
	return 0;
}

Android功耗系列专题理论之十一:高通QCOM平台待机功耗问题分析方法 本文详细介绍了高通QCOM平台待机功耗问题的分析方法。首先强调测试环境标准化的重要性,包括关闭无线功能、日志记录和非必要传感器。重点分析了硬件连接检查、驱动配置验证、电源管理策略优化等关键步骤。文章详细讲解了射频校准、时钟源/中断分析、子系统状态检查等专业技术方法,并提供了具体的命令行操作示例。此外还介绍了外设拆解、外灌电压测试等硬件排查手段,以及功耗分解板、波形分析等高级诊断技术。最后强调了固件版本验证和环境因素测试的必要性,为工程师提供了系统性的功耗问题排查思路。 阅读详情

相关推荐

ROS2节点通信实战:用C++手写一个‘智能小车’控制模型(附完整代码)

本文详细介绍了如何使用ROS2和C++构建一个智能小车控制模型,涵盖运动控制节点、电池管理服务、参数动态配置和Rviz可视化等核心功能。通过实战项目演示ROS2节点通信机制,帮助开发者快速掌握机器人开发的关键技术,并提供了完整的代码实现和系统集成方案。

weixin_30607029的博客 262

hdu 1429 胜利大逃亡(续) 二进制bfs

题目链接 题意: 这个题就是一个简单搜索,但是需要找到钥匙才能开门,比较巧妙的方法就是利用二进制了,一把钥匙和一个门对应一个二进制了,如果找到了钥匙就把这位二进制变为1,当遇到门的时候只需要判断这一位是否为1就知道是否有钥匙打开门了,如果没有就将们重新放回队当中,直到找到钥匙。      当然这个题也可以不用二进制用数组记录是否找到钥匙可以的,只是觉得这种方法和思维比较好就记录一下。

Marcus-Bao的个人主页 548

Flowable第一篇、快速上手(Flowable安装、配置、集成)

Flowable是一个轻量级、高效可扩展的工作流和业务流程管理(BPM)引擎,支持在Java应用程序中实现复杂的工作流自动化。Flowable最初是作为Activiti项目的一个分支发展而来的,但它现在已经成为一个独立的开源项目,并在企业级应用中得到了广泛使用

Du_XiaoNan的博客 1万+

HDU 1429胜利大逃亡(续) (bfs+二进制压缩)

题目链接 Problem Description Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)…… 这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带锁的门,钥匙藏在地牢另外的某些地方。刚开始Ignatius被关在(sx,sy)的位置,离开地牢的门在(ex,ey)的位置。Ignatius每分钟只能从一个坐标走到相邻四个坐标中的其中一...

dream_three的博客 235

【Qt】QML-01:使用QtCreator10创建QML工程,并讲解第一个程序:Hello World

QML第一讲:创建QML工程、详解QML第一个程序Hello World

郭老二 7796

微软登录OAuth 2.0授权流程

OAuth 2.0是一个关于授权的开放网络标准,它允许第三方应用获取用户数据,是目前最流行的授权机制。微软身份平台支持OAuth 2.0授权码流程,使得客户端应用程序能够获得对受保护资源(如网络API)的授权访问。这一流程在保障用户数据安全的前提下,实现了应用的便捷登录与数据共享。当用户在一个支持OAuth 2.0的应用上,希望使用微软账号进行登录时,OAuth 2.0授权流程即被触发。

qq_36569837的博客 4091

(HDU 1429)胜利大逃亡(续) BFS + 二进制状态压缩

胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 8588 Accepted Submission(s): 3085Problem Description Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜

STILLxjy 463

2026年03月CCF-GESP编程能力等级认证C++编程一级真题解析

本文收录于专栏《。订阅后可阅读专栏内所有文章。

人生就是一个不断学习的过程 339

HDU - 1429胜利大逃亡(续)bfs与二进制按位操作

 思路: 有点像我们以前玩的魔塔,拿小写字母表示钥匙,去开大写字母的门,如果用模板的bfs去写,将vis设为二维数组,记录地图上的二维坐标,来标记走过的点,那么这样很明显会失败,因为勇士是可能要拿钥匙后,走之前标记过的回头路,所以我们要用vis三维数组存状态。第三维存钥匙的种类。 那么问题来了,钥匙是个字符,而vis是三维整型数组,怎么转化呢? 可以用二进制的按位与,按位或操作来实现钥匙的获...

一条菜狗的博客 249

Android Framework WMS全面概述和知识要点

WindowManagerService 类是整个 WMS 的核心大脑,处于系统服务层,负责协调和管理所有与窗口相关的操作。它在 Android 系统架构中起到承上启下的关键作用,向上对接应用层的窗口请求,向下与 SurfaceFlinger 等底层组件交互,确保窗口能够正确地在屏幕上显示和管理。

大模型大数据攻城狮的专栏 1795

ML307R OpenCPU TCP使用

实现现象 平台下发数据,板子在收到数据之后,马上再发送到平台,通过串口助手可以看到已经接收到数据。ML307R TCP 是使用LWIP的标准的socket通信,具体TCP流程可以自行百度。实验目的:实现把接收的数据再发送到服务端。因为是4G,所以必须用外网的。

面朝大海春暖花开 2232

HDU 1429.胜利大逃亡(续)

胜利大逃亡(续) Time Limit:2000MSMemory Limit:32768KB64bit IO Format:%I64d & %I64u SubmitStatusPracticeHDU 1429 Description Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)……这次魔王汲取了上次的教训,把Ignati...

weixin_30558305的博客 133

AI编程工具到底是初学者的绊脚石还是垫脚石?

现在是AI时代,我们要做的,是学会拥抱AI、使用AI,成为AI的驾驭者,如果你因为害怕使用AI学不到东西,那么大可不必,因为AI必然是今后的趋势,相信会用AI在今后的求职面试中也会有很大的占比。另外我之前写了多篇有关AI编程开发工具Trae的使用技巧和教程,需要的话你可以关注公众号后通过菜单栏获取。另外我也把所有Trae相关的文章整合到了腾讯ima知识库,感兴趣的可以关注公众号以后回复。

cpp加油站的专栏 188

HDU 1429 (bfs+状态的位压缩)

hdu 1429胜利大逃亡(续) 一共有10把钥匙,用10位的二进制反映钥匙的拥有情况 #include <iostream> #include <cstring> #include<cstdio> #include <queue> using namespace std; char maze[21][21]; int n,m,...

weixin_30411997的博客 114

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

hdu1429胜利大逃亡(续)(状态压缩+bfs)

题目链接: 啊哈哈,点我点我 题意及思路 两个状态压缩+bfs的题,两个题其实是一样的,所以我讲一个。。。就选1429吧。。 最开始我以为跟普通的bfs一样,所以直接写了一个朴素的bfs,一跑,前两组数据对了,但是第三组不对,一看,走过的还可以走啊,所以不能标记,结果我的bfs乱改,最后 毫无疑问改成了死循环。所以看题解。。。 思路:因为有10中不同的钥匙,每种都有两种状态,所以结合

大洋深处 2199

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

HDU1429 胜利大逃亡(续)

http://acm.hdu.edu.cn/showproblem.php?pid=1429学习位压缩很好的一道题,因为只有10把钥匙,那么可以把10钥匙压缩二进制,比如1000就表示身上只要第4把钥匙的状态,110表示带有第2把和第3把钥匙,那么要判断当前的钥匙串有没有能打开当前门钥匙,那么就只要一个&运算就可以,因为11101110&00100000==00100000 这样就说明那一把钥

3081

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

HDU 1429 胜利大逃亡(续)(bfs+状态压缩,很经典)

&#13; 传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1429 胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 10648    Accepted ...

Y先森0.0 207

【状态压缩】HDU 1429 胜利大逃亡(续)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1429

F丶轩 2800

BFS 题目整理 POJ2251、HDU1429、POJ3182、USACO06、UVA10047 The Monocycle

BFS POJ 2251 Dungeon Master 题意 有一个三维监狱,每一步可以向东,向西,向北,向南,向上,向下移动 ‘S’为起点,'E’为出口,’#‘为墙,’.'为路 分析 找到起点,直接bfs即可 代码 #include <iostream> #include <cstdio> #include <algorithm> #include <q...

qcwlmqy的博客 215

HDU 1429 胜利大逃亡(续) 状态压缩BFS

/* 记录状态的bfs,用到了二进制状态压缩 http://acm.hdu.edu.cn/showproblem.php?pid=1429 */ #include #include #include #include #include #define N 20010 u

Join Hands 1330

hdu 1429 胜利大逃亡(续)(BFS+位压缩+走回头路)

胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 8808    Accepted Submission(s): 3186 Problem Description Ignatius再次被魔王抓走了(搞不懂他

咸鱼有梦想 376

HDU1429(胜利大逃亡(续))

胜利大逃亡(续) Problem Description Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)…… 这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带锁的门,钥匙藏在地牢另外的某些地方。刚开始Ignatius被关在(sx,sy)的位置,离开地牢的门在(ex,ey)的位置。Ignatius每分钟只能从一个坐标走到相邻四个坐标中的其中一个。魔王每t分钟回地牢视察一次,若发现Ignatius不在原位置便把他拎回去。经过若干次的尝试,Ignatiu

weixin_43808717的博客 288

hdu 1429 胜利大逃亡(续) bfs+状态压缩

胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 8425    Accepted Submission(s): 3022 Problem Description Ignatius再次被魔王抓走了(

343

HDU1429 胜利大逃亡(续)(BFS+状态压缩)

题目链接:点击打开链接 题意:迷宫中,一个起点,一个终点,迷宫中有墙,有门,门的钥匙也在迷宫中某处,只有拿到钥匙才能打开门,问能不能再T步(不含)之内逃出迷宫。 题解:在朴素BFS上增加了钥匙的状态,只有有钥匙才能打开门,总共有不超过10吧钥匙,所以用一个int的整数的二进制即可存储钥匙的状态。碰到门先判断状态,碰到钥匙更新状态。 代码: #include #include #includ

Keaper的博客 1273

胜利大逃亡(续) HDU - 1429

胜利大逃亡(续) 题目链接: HDU - 1429题意:小明被抓到n*m的迷宫中,@表示小明的初始位置, ^表示迷宫出口, *表示障碍物,  ·  表示空地, A~J表示门, a~j表示钥匙, 对应的钥匙开对应字符的门;问小明能否在t时间内逃出迷宫?(若在第t时间到达迷宫出口, 记为未逃出迷宫);需要先拿到钥匙才...

Sirius_han的博客 285

胜利大逃亡(续) HDU-1429

胜利大逃亡(续) HDU-1429 题目链接 思路:状态压缩+bfs 状态压缩很常用也很简单,网上有很多关于状态压缩的博客,我就不再赘述。因为A-J只有十把钥匙和门,而状态只有找到和没有找到钥匙,利用二进制进行状态压缩。 坑:时间到了则判为失败,而不是被抓回起点。#include <bits/stdc++.h> #define maxn 22 using namespace std; in

acmer_guo的博客 317
上一篇: Number Sequence (KMP算法)
下一篇: 【经典算法】——KMP,深入讲解next数组的求解
LiQiyaoo
博客等级 码龄11年 337粉丝 206原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值