小丑的身份证和复印件 (BFS + Floyd)

本题链接:登录—专业IT笔试面试备考平台_牛客网

题目:

样例:

输入
2 10
(JOKERjoke
#####asdr)
输出
12

思路:

        根据题意,要求最短时间,实际上也可以理解为最短距离。

        所以应该联想到有关最短距离的算法,在这里给出的 n,m是100,所以我们可以暴力求最短距离即可,身份碎片虽然分大小写,但是它们都是唯一的点,所以可以通过Floyd,记录每个点之间的最短距离,随后累加即可,其次这里的最短距离可以用BFS求得最短距离。注意一个细节,初始化无穷大的时候,尽量小一些,否则多个INF累加爆 long long 就会答案错误。

代码详解如下:

#include <iostream>
#include <vector>
#include <queue>
#include <climits>
#include <algorithm>
#define endl '\n'
#define int long long
#define x first
#define y second
#define umap unordered_map
#define All(x) x.begin(),x.end()
#pragma GCC optimize(3,"Ofast","inline")
#define IOS std::ios::sync_with_stdio(false),cin.tie(0), cout.tie(0)
using namespace std;
const int N = 2e6 + 10;
inline void solve();

signed main()
{
//	freopen("a.txt", "r", stdin);
	IOS;
	int _t = 1;
	// cin >> _t;
	while (_t--)
	{
		solve();
	}
	return 0;
}
using PII = pair<int,int>;
int n,m;
PII rem[256];	// rem 记录最短路中字符的位置
char g[110][110];

int dist[256][256];	// Floyd最短距离

int dx[] = {0,1,0,-1};
int dy[] = {1,0,-1,0};
// BFS 求字符a 到字符 b 之间的最短路
inline int Dist(char a,char b)
{
	// 标记是否走动过当前位置
	vector<vector<bool>>st(110,vector<bool>(110,false));
	// 判断是否可以走动的条件
	auto isRun = [&](int x,int y)->bool
	{
		return (x >= 0 and x < n and y >= 0 and y < m and !st[x][y] and g[x][y] != '#');
	};
	
	// BFS 求最短路
	int step = 0;
	queue<PII>q;
	q.emplace(rem[a]);
	while(q.size())
	{
		int sz = q.size();
		while(sz--)
		{
			PII now = q.front();
			q.pop();
			if(g[now.x][now.y] == b)
			{
				rem[b] = now;	// 记录当前最短路的位置
				return step;
			}
			st[now.x][now.y] = true;
			for(int i = 0;i < 4;++i)
			{
				int bx = now.x + dx[i];
				int by = now.y + dy[i];
				if(isRun(bx,by))
				{
					st[bx][by] = true;
					q.emplace(PII(bx,by));
				}
			}
		}
		++step;
	}
	// 返回无穷大
	return INT_MAX;
}

inline void solve()
{
	// 拿取碎片的方案
	vector<char>plan = {'J','O','K','E','R','j','o','k','e','r'};

	cin >> n >> m;
	for(int i = 0;i < n;++i)
	{
		for(int j = 0;j < m;++j)
		{
			char c;
			cin >> c;
			g[i][j] = c;
			// 存储好起点和终点的位置
			if(c == '(') rem[c] = PII(i,j);
			if(c == ')') rem[c] = PII(i,j);
		}
	}
	
	// 存储起点到各个字符之间的最短距离
	for(char &p:plan) dist['('][p] = Dist('(',p);
	
	// 存储终点到各个字符之间的最短距离
	for(char &p:plan) dist[p][')'] = Dist(')',p);
	
	// 存储各个点之间的最短距离
	for(char &st:plan)
	{
		for(char &ed:plan)
		{
			if(st == ed) continue;
			dist[st][ed] = Dist(st,ed);
		}
	}
	
	sort(All(plan));
	// 全排列遍历所有的捡碎片方案
	// 获取最小的一种答案即可
	int ans = INT_MAX;
	do
	{
		int res = 0;
		res += dist['('][*plan.begin()]; //累加起点开始的最短距离
		for(int i = 1;i < 10;++i) res += dist[plan[i - 1]][plan[i]];	// 按顺序累加最短距离
		res += dist[plan.back()][')'];	// 累加最后到终点最短距离
		ans = min(ans,res);

	}while(next_permutation(All(plan)));

	if(ans >= INT_MAX) cout << "-1" << endl;
	else cout << ans << endl;
}

最后提交:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

css z-Index 详解--子元素盖在父元素的兄弟元素上

前置知识 1、z-index 只有在定位元素上才会生效&#xff08;即非static定位的元素上&#xff09; 2、同级元素&#xff0c;无论是z-index 相同还是没设置。后面的元素层级比前面 3、元素上有 transform 属性 z-index 会失效 dom结构如下 // dom部分 <div><div id&quo…

latex algorithm2e 库学习总结

案例1 \documentclass{article}\usepackage{xeCJK} \usepackage[]{algorithm2e} %\usepackage{ctex} % 中文包\begin{document}\renewcommand{\algorithmcfname}{算法} % 把标题设置为“算法” \begin{algorithm…

html table thead打印时带重复表头不生效

今天做一个打印功能时要求每页都带相同的表头&#xff0c;使用的方式是table的thead标签来实现&#xff0c;结果发现thead里边的内容放多了之后只有第一页才会有表头。最后发现问题是 thead的内容不能超过table的25%。

实例分割——Mask R-CNN、YOLOV8、RTMDET、DeepLab四种实例分割算法比对

1.概述 1.1 语义分割与实例分割 实例分割和语义分割都是计算机视觉领域中图像分割的任务&#xff0c;它们在目标和方法上有一些区别&#xff1a; 语义分割&#xff1a; 语义分割的目标是对图像中的每个像素打上类别标签&#xff0c;即识别出图像中每个像素属于哪个预定义的…

云动态摘要 2024-05-09

给您带来云厂商的最新动态&#xff0c;最新产品资讯和最新优惠更新。 最新优惠与活动 [免费试用]即刻畅享自研SaaS产品 腾讯云 2024-04-25 涵盖办公协同、营销拓客、上云安全保障、数据分析处理等多场景 云服务器ECS试用产品续用 阿里云 2024-04-14 云服务器ECS试用产品续用…

YOLOv5,YOLOv7改进之结合​SOCA

1.SOCA moudle结构图 2,YOLOv5,YOLOv7改进之结合​SOCA 1.配置common.py文件 #SOCA moudle 单幅图像超分辨率 class Covpool(Function):@staticmethoddef forward(ctx, input):x = inputbatchSize = x.data.shape[0]dim = x.data.shape[1]h = x.data.shape[2]w = x.data.sha…

PLC学习笔记

PLC学习笔记 前言一、一些基操知识二、GX works2编程2.1 位逻辑1.2 中间寄存器1.3 PLC的扫描方式 总结 前言 我这个人真的是太渴望知识了~ 一、一些基操知识 一般X表示输入&#xff0c;Y表示输出。一般八个为一组X0~X7M表示中间寄存器&#xff0c;M0~M7时间T、计数C 二、GX …

短信群发公司

伴随着移动互联网和智能手机的普及&#xff0c;短信群发成为了企业与个人之间高效沟通的一种重要方式。短信群发公司应运而生&#xff0c;致力于为用户提供专业、安全、高效的群发服务。 服务内容 短信群发公司提供多样化的服务内容&#xff0c;满足不同用户的需求。短信群发公…

javaWeb快速部署到tomcat阿里云服务器

目录 准备 关闭防火墙 配置阿里云安全组 点击控制台 点击导航栏按钮 点击云服务器ECS 点击安全组 点击管理规则 点击手动添加 设置完成 配置web服务 使用yum安装heepd服务 启动httpd服务 查看信息 部署java通过Maven打包好的war包项目 Maven打包项目 上传项目 …

深度学习笔记001

目录 一、批量规范化 二、残差网络ResNet 三、稠密连接网络&#xff08;DenseNet&#xff09; 四、循环神经网络 五、信息论 六、梯度截断 本篇blog仅仅是本人在学习《动手学深度学习 Pytorch版》一书中做的一些笔记&#xff0c;感兴趣的读者可以去官网http://zh.gluon.a…

Abp框架,EF 生成迁移文件时,自动添加表和字段注释内容

在使用 abp 框架&#xff0c;或者ef 的时候都会遇到一个问题&#xff0c;就是建实体后要将实体描述生成到数据库中&#xff0c;就需要手动去添加 [Comment("注释内容")] 注解&#xff0c;这样相当于手动写两次注释&#xff08;即使你是 Ctrl C&#xff09;&#x…

若依集成mybatis-plus 超详细教程(亲测可用)

文章目录 简介步骤第一步第二步第三步第四步第五步第六步 使用QueryWrapperservice层impl 实现接口类层Mapper层 简介 话不多说 直接跟着下面的教程操作&#xff0c;如果有报错私信我&#xff0c;或者通过博文下面的微信名片加我微信&#xff0c;免费解答哦&#xff01; 步骤 …

解决方案:‘Series‘ object has no attribute ‘xxxx‘

文章目录 一、现象二、解决方案 一、现象 ...... model.fit(X_train, y_train) y_pred model.predict(X_test) recall recall_score(y_test, y_pred) precision precision_score(y_test. y_pred) ......执行语句到**“precision precision_score(y_test. y_pred)”**这里发…

StarRocks 跨集群数据迁移,SDM 帮你一键搞定!

作者&#xff1a;严祥光&#xff0c;StarRocks Active Contributor&#xff0c;StarRocks 存算分离核心研发&#xff0c;在社区中主要负责数据导入、跨集群同步、数据迁移和容灾等工作。 有时候&#xff0c;你可能会为以下需求而苦恼&#xff0c;苦苦搜索更好的解决方案&#x…

记录创建项目java version 没有8的问题

问题&#xff1a; 解决方案 java版本选择21&#xff08;21可以兼容jdk8&#xff09; SpringBoot选择3.2.5 进入项目后手动在pom.xml中修改版本

基于stm32的spi从机实验HAL库编程

目录 基于stm32的spi从机实验HAL库编程前言业务场景硬件设计接线配置swd接口配置spi配置DMA配置中断配置系统时钟配置工程生成代码写点从机代码上机现象后记本文使用的测试工程 基于stm32的spi从机实验HAL库编程 前言 在微控制器的世界中&#xff0c;串行外设接口(SPI)是一种…

java面向对象实现文字格斗游戏细节完善版

为了完善上一篇的文字格斗游戏的细节&#xff0c;所以加了些代码&#xff0c;使得交互更加的具体有趣! 效果 大家可以多运行几次代码&#xff0c;得到不同的战况&#xff01;&#xff01; 代码实现 1.bean类 import java.util.Random;public class TextGame {private Strin…

ardupilot的固定翼飞行模式

飞行模式 APM所有的飞行模式都在对应的机型的文件夹下的mode.h里面有定义,针对于不同的模型,功能函数在基类中Mode中都是以纯虚函数实现了, 然后在继承的子类中重新实现它,以实现多态。 takeoff模式 参见网址在 ArduPlane 4.0 及更高版本中,自动起飞本身也是一种模式(…

文件操作

前言&#xff1a; 文件内容属性 要向访问文件就要打开文件——>用进程来打开——>要把文件先加载到内存中——> 一个进程可以打开多个文件&#xff0c;OS中也有可能多个进程打开了多个文件 文件以多&#xff0c;就需要进行管理&#xff0c;——先描述再组织 没有被打开…

【图文教程】PyCharm安装配置PyQt5+QtDesigner+PyUic+PyRcc

这里写目录标题 PyQt5、Qt Designer、PyUic、PyRcc简介&#xff08;1&#xff09;下载安装PyQt5&#xff08;2&#xff09;打开designer.exe所在位置&#xff08;3&#xff09;在PyCharm中配置QtDesigner&#xff08;4&#xff09;验证QtDesigner是否配置成功&#xff08;5&…