【多维BFS】AB路线

news2024/12/27 12:57:44

P2038 - AB 路线 - ZJHUOJ

题意:

 

思路:

首先看是什么影响了决策,即能不能走这个格子

走到当前格子是第几步和格子的字符种类影响了能不能走该格子,因此需要多加一维k,表示走到当前字符种类的第k步

然后就可以去BFS了,但是每个状态可能会重复遍历,我们要求的是最少步数,怎么办

可以用一个类似与最短路的办法,记录一个DP数组,然后松弛

最后在统计答案的时候记得枚举一下这是以第几步到达的终点

Code:

#include <bits/stdc++.h>

//#define int long long

using namespace std;

const int mxn=1e3+10;
const int mxe=1e6+10;
const int mod=1e9+7;
const int Inf=0x3f3f3f3f;

queue<array<int,4> > Q;
//dis,x,y,k
//距离,横坐标,纵坐标,该字符走了几步

string s[mxn];

int N,M,K;
int dx[4]={-1,0,1,0},dy[4]={0,-1,0,1};
int dp[mxn][mxn][12];
int a[mxn][mxn];

bool check(int x,int y){
	return x>=1&&x<=N&&y>=1&&y<=M;
}
void bfs(){
	memset(dp,0x3f,sizeof(dp));
	dp[1][1][1]=0;
	Q.push({0,1,1,1});
	while(!Q.empty()){
		auto it=Q.front();
		Q.pop();
		for(int i=0;i<4;i++){
			int x=it[1],y=it[2],k=it[3];
			int dis=it[0];
			int vx=x+dx[i];
			int vy=y+dy[i];
			int vk=k+1;
			if(check(vx,vy)){
				if(a[vx][vy]==a[x][y]){
					if(vk==K+1) continue;
					if(dp[vx][vy][vk]>dis+1){
						dp[vx][vy][vk]=dis+1;
						Q.push({dis+1,vx,vy,vk});
					}
				}else{
					if(vk!=K+1) continue;
					if(dp[vx][vy][1]>dis+1){
						dp[vx][vy][1]=dis+1;
						Q.push({dis+1,vx,vy,1});
					}
				}
			}
		}
	}
}
void solve(){
	cin>>N>>M>>K;
	for(int i=1;i<=N;i++){
		cin>>s[i];
		s[i]=" "+s[i];
	}
	for(int i=1;i<=N;i++){
		for(int j=1;j<=M;j++){
			if(s[i][j]=='A') a[i][j]=1;
			else a[i][j]=0;
		}
	}
	bfs();
	int mi=1e9;
	for(int i=1;i<=K;i++) mi=min(mi,dp[N][M][i]);
	if(mi==1e9) cout<<-1<<'\n';
	else cout<<mi<<'\n';
}
signed main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int __=1;//cin>>__;
	while(__--)solve();return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/721629.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Jvm对象创建-JVM(六)

上篇文章说了jvisualvm工具查看年轻代老年代gc过程。 Jvisualvm&内存模型剖析-JVM&#xff08;五&#xff09;https://blog.csdn.net/ke1ying/article/details/131524708 jvm创建对象 之前我们介绍了类的加载&#xff0c;这篇文章要介绍类的创建&#xff0c;过程主要是&a…

通俗易懂生成对抗网络GAN原理(二)

生成对抗网络&#xff08;Generative Adversarial Network, GAN&#xff09;的原理 学习李宏毅机器学习课程总结。 前面学习了GAN的直观的介绍&#xff0c;现在学习GAN的基本理论。现在我们来学习GAN背后的理论。 引言 假设x是一张图片&#xff08;一个高维向量&#xff09;…

「AntV」使用AntV X6实现流程编排设计器

通过对BPMN的深入学习&#xff0c;以及对业界成熟的流程编排设计器的调研&#xff0c;了解到要研发一个流程编排设计器&#xff0c;需要实现如下几个主要的功能&#xff1a; 支持创建各种流程图元素&#xff0c;包括任务&#xff08;活动&#xff09;、网关、事件等。支持绘制…

漏洞复现 || NginxWebUI 后台命令执行runCmd远程命令执行

免责声明 技术文章仅供参考&#xff0c;任何个人和组织使用网络应当遵守宪法法律&#xff0c;遵守公共秩序&#xff0c;尊重社会公德&#xff0c;不得利用网络从事危害国家安全、荣誉和利益&#xff0c;未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此…

【Linux】yum git 的使用

yum 的使用 yum 源的查看 yum 源就是一个配置文件。 可以看到 yum 源的文件中包含有很多下载源的链接。我们使用 yum 命令进行安装的时候&#xff0c;就是通过这些链接去寻找下载源进行下载的。这些链接一般都是国内的镜像网址。 所谓的更新 yum 源&#xff0c;也就是将最新…

异步交互技术Ajax

Ajax 概念&#xff1a;Asynchronous JavaScr And XML 异步的JavaScript和XML作用&#xff1a; 数据交换&#xff1a;通过Ajax可以给服务器发送请求&#xff0c;并获取服务响应的数据异步交互&#xff1a;可以在不重新加载整个页面的情况下&#xff0c;与服务器交换数据并更新部…

mysqldump + python 定时备份数据库

场景&#xff1a; 需要对mysql进行定时备份&#xff0c;受限于硬盘空间的大小&#xff0c;需要对备份的数据需要定时清理 python代码实现&#xff1a; # -*- coding:UTF-8 -*- """ProjectName : HotelGo2DelonixPmxFileName : fix_missing_ratesDescripti…

第二章:L2JMobius学习 – 安装jdk17

L2JMobius是一套开源的 LineageII 的服务器端代码&#xff0c;使用Java语言编写。想要运行L2JMobius源程序的话&#xff0c;需要安装jdk17版本。首先&#xff0c;下载jdk17版本。 https://download.oracle.com/java/17/latest/jdk-17_windows-x64_bin.msi 当然&#xff0c;也…

华为OD机试真题 Java 实现【新员工座位安排系统】【2022Q4 100分】,附详细解题思路

目录 一、题目描述二、输入描述三、输出描述四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 一、题目描述 工位由序列F1,F2…Fn组成&#xff0c;Fi值为0、1或2。其中0代表空置&#xff0c;1代表有人&#xff0c;2代表障碍物。 1、某一空位的友好度为左右连续…

ModaHub魔搭社区:腾讯云发布的向量数据库有什么特点?技术架构是什么样的?

腾讯云发布的向量数据库有什么特点&#xff1f;技术架构是什么样的&#xff1f; Tencent Cloud VectorDB从性能上看&#xff0c;具备高性能、高可用、低成本等优势&#xff0c;比如单索引支持10亿级向量规模&#xff0c;最快支持毫秒级数据实时更新&#xff0c;适用于AI运算、…

【STM32】自举模式 和 程序下载(ST-Link和串口示例)

STM32官方网站STM32中文社区 如果遇到不清楚的概念&#xff0c;可以看之前的文章。 一、自举模式二、程序下载2.1 概述2.2 实操2.21 SWD 方式下载&#xff08;ST-Link&#xff09;2.22 串口下载 一、自举模式 STM32有一个特殊的功能&#xff0c;就是可以通过不同的方式启动程序…

maven 工程结构 和 archetype 模板

文章目录 一、maven 工程结构1.1. jar 工程结构1.2. war 工程结构 二、archetype 模板2.1. 推荐的 archetype 模板2.2. 自定义 archetype 模板2.2.1 自定义模板示例 有没有好奇过&#xff0c;通过 Maven 生命周期命令构建项目时&#xff0c;我们并没有指定源文件目录和编译后的…

5张图告诉你:同样是职场人,差距怎么这么大?

点赞 ➕ 评论 ➕ 收藏 养成三连好习惯 在职场中&#xff0c;我们常常会听到各种各样的抱怨&#xff1a; &#x1f469;‍⚖️‍ 小A: 凭什么别人每次述职绩效都是优秀呀&#xff1f; 感觉TA也没干啥呀! &#x1f575; 小B: 凭啥这个事情&#xff0c;领导指派TA去对接呀&#…

“设计模式”概述

设计模式代码样例&#xff1a;Git 设计原则 依赖倒置原则&#xff08;DIP&#xff09; 高层模块&#xff08;稳定&#xff09;不应依赖底层模块&#xff08;变化&#xff09;&#xff0c;二者都应依赖于抽象&#xff08;稳定&#xff09;抽象不应依赖于实现细节&#xff0c;…

YoloV5/YoloV7改进---注意力机制:线性上下文变换LCT,性能优于SE

目录 1.LCT介绍 2.LCT引入到yolov5 2.1 加入common.py中&#xff1a; 2.2 加入yolo.py中&#xff1a; 2.3 yolov5s_LCT.yaml 2.4 yolov5s_LCT1.yaml 3.YOLOv5/YOLOv7魔术师专栏介绍 1.LCT介绍 论文&#xff1a; https://arxiv.org/pdf/1909.03834v2.pdf AAAI 2020 摘要&a…

最长上升子序列 (从dp---->贪心)

最长上升子序列 思路&#xff1a; 题目要求找到最长上升的子序列&#xff0c;那么这个时候&#xff0c;我们可以假以第i个为结尾&#xff0c;那么此时以i为结尾的最大上升子序列是多少。但是这个时候&#xff0c;会发现&#xff0c;从第i个为结尾往前面找的话&#xff0c;是一…

20230705点亮STC32G实验箱9.6(STC32G12K128)开发板的跑马灯LED(深入了解)

08第六集&#xff1a;LED闪烁第六集&#xff1a;LED闪烁和花式点灯上和花式点灯上.mp4 09第六集&#xff1a;LED闪烁和花式点灯下.mp4 【大文哥学习32位8051】20230704【冲哥视频】第六集的晶振时钟的学习困惑 2023/7/5 17:36 delay_ms(3000); 刷机的时候如果使用11.0592M的Fos…

Ardupilot学习笔记

参考文献 【1】https://ardupilot.org 主打的就是一个炫酷 自驾仪 Ardupilot 一套开源的自驾仪&#xff0c;集成了各种各样的代码&#xff0c;包括其他开源代码(如PX4代码)和项目、驱动等。 即&#xff1a;自驾仪即集成了整个可以实现无人载具&#xff08;如无人机&#xff…

Day_61-62 决策树

目录 Day_61-62决策树(准备工作) 一. 算法的基本概念 1. 决策树的定义 2. 如何构建决策树&#xff1f; 2.1 熵 2.2 信息增益原则 2.3 计算步骤 二. 示例演示 1. 第一次节点决策分类&#xff1a; 2. 后续节点的决策分类 3. 决策分类的结束条件 三. 代码实现 1. 主函数 2. 两个构…

Matlab把两个不同的x轴和y轴画在同一个图里

我们知道画两个y轴可以用yyaxis. 那么画两个x轴呢? 这时候可以用神奇的tiledlayout. % 创建两组数据 x1 0:0.1:40; y1 4.*cos(x1)./(x12); x2 1:0.2:20; y2 x2.^2./x2.^3;t tiledlayout(1,1); % 创建一个tiledlayout % 第一个坐标系 ax1 axes(t); % 创建坐标系, 指定t为…