再破难关(BFS)

news/2025/3/16 0:18:51/文章来源:https://www.cnblogs.com/bakul/p/18774428

问题 F: 再破难关

题目描述

OIBH组织派出的黄金十二人+青铜五小强还没有到, 他们只能指望原先的机关能够阻拦住柯南的脚步。柯南打开大门之后发现里面还有一个门, 门上还有一个神奇的锁(-,-)
这是一个4*4的锁, 上面有8个凸起的格子和8个被按下的格子,当且仅当两个格子有公共边时, 则称这两个格子是相邻的。

每次操作只能够交换相邻的两个格子,柯南看到了初始锁的状态和目标锁的状态,同样组织只允许他用最少步数打开锁。

输入

第1到4行每行四个数字(1或者0),描述了初始锁状态。
接着是一个空行
第6到9行每行四个数字,描述了最终锁状态。

输出

输出只有一行,是一个整数n,表示最少的操作次数。

样例输入

1111
0000
1110
0010 1010
0101
1010
0101

样例输出

4

分析

这道题题意就是在最短的交换次数从原图转换为目标图
这可以看作是图,每个状态为节点,一次操作作为从当前状态到新状态的边,但我不是很能理解,可能最后像树一样,树的高度就是最少操作数
这道题的核心是使用BFS实现合法的交换,对新状态再进行BFS合法交换,每次只能和相邻的点交换,那么从一个状态可以走出4种状态,一直进行下去相当于一棵4叉数,实现遍历所有情况,其中对已经实现过的情况进行剪枝
逐步实现:

  1. 怎么储存状态?把4x4的表格二维图转化为一维的字符串相当于把v[i][j]映射到s[i*4+j]
  2. 剪枝和记录状态,使用哈希表就可以了
  3. BFS的实现,当然用是queue
  4. 由于交换操作要求相邻格子才能交换,意味着在一个状态中,选定一对相邻格子,如果一个是 1、另一个是 0,则交换后形成新的状态。

代码细节


signed main() {// ios::sync_with_stdio(0);// cin.tie(0);// cout.tie(0);string orgsta = "",ditsta = "";  //初始状态和目标状态for (int i = 0;i < 4;++i)for (int j = 0;j < 4;j++) {char t;cin >> t;               //先读入为int的话因为没有空格,一行会被当作一个数读入orgsta += t;}//cout << orgsta;for (int i = 0;i < 4;++i)for (int j = 0;j < 4;j++) {char t;cin >> t;ditsta += t;}if (orgsta == ditsta) {      //初状态等于目标状态cout << 0;return 0;}queue<string> q;unordered_map<string,int> mp;  //标记状态,顺便记录操作次数q.push(orgsta);mp[orgsta] = 0;int tx[4]{0,1,0,-1};int ty[4]{1,0,-1,0};while (!q.empty()) {string cur = q.front();q.pop();for (int i = 0;i < 16;++i) {       //对每一个进行一次BFSint x  = i/4, y = i % 4;       //还原坐标for (int j = 0; j <  4;++j) {int nx = x + tx[j],ny = ty[j] + y;if (nx >= 0 && nx < 4 && ny >= 0 && ny < 4 && cur[i] != cur[nx*4+ny]) {  //满足交换条件string now = cur;    swap(now[i] , now[nx*4+ny]);if (!mp.count(now)) {         //这里使用count检查key,直接使用mp[now]==0,的话,如果回到初始状态,那么初始状态恰好等于0,可能会错mp[now] = mp[cur] + 1;if (now == ditsta) {cout << mp[now];return 0;}q.push(now);             }}}}}return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LLM大模型:OpenManus原理

继deepseek之后,武汉一个开发monica的团队又开发了manus,号称是全球第一个通用的agent!各路自媒体企图复刻下一个deepseek,疯狂报道!然而manus发布后不久,metaGPT团队5个工程师号称耗时3小时就搞定了一个demo版本的manus,取名openManus,才几天时间就收获了34.4K的start…

Day14_TCP三次握手

每日一题 TCP三次握手详解 三次握手(Three-Way Handshake) 是TCP协议建立可靠连接的核心过程,确保通信双方能够正常收发数据并同步初始序列号。以下是详细步骤和原理:1. 第一次握手:SYN(客户端 → 服务器)动作:客户端发送一个TCP报文,设置SYN=1(同步标志位),并生成…

Paimon merge into 实现原理

语法 MERGE INTO target USING source ON source.a = target.a WHEN MATCHED THEN UPDATE SET a = source.a, b = source.b, c = source.c WHEN NOT MATCHED THEN INSERT (a, b, c) values (a, b, c)merge into 实际上是一个语法糖, 相对应的语义也可以通过其他的 sql…

MACD

目录背景和价值用法快线在0轴上方 - 多头较强,否则多头较弱快线上穿慢线 形成金叉,形成多头信号。 快线下穿慢线 形成死叉,形成空头信号顶背离和底背离参考资料 背景和价值 指数平滑移动平均线两个(12和26)均线相交,12EMA上穿26EMA形成金叉,快线从0轴下方上穿0轴上方 用…

python 文件打包成 whl

首先需要安装 wheel, setuptools pip install setuptools wheel简单进行一个打包的例子,项目目录结构如下:# __init__.py def pytest_collection_modifyitems(session, config, items):for item in items:# item.name 用例名称item.name = item.name.encode(utf-8).decode(un…

cmake识别不到vcpkg安装的包的解决(以libssh为例)

承接上篇 vcpkg 跨平台的c/c++库包管理工具(以libssh为例) - 夕西行 - 博客园 vcpkg安装libssh后,vs2022创建的cmake项目竟然不能find_package到libssh 问题出在CMakeLists.txt,注意位置1、2、3的顺序一定不能变cmake_minimum_required (VERSION 3.20)#vcpkg————位置1 …

昆工昆明理工大学冶金最新复试真题及答案

--冶金工程考研809冶金物理化学有色冶金学有色金属冶金冶金过程及设备F002钢铁冶金学冶金调剂

《Transformer自然语言处理实战 : 使用Hugging Face Transformers库构建NLP应用》PDF免费下载

《Transformer自然语言处理实战》聚焦 Hugging Face Transformers 库,系统讲解 Transformer 模型在 NLP 任务中的应用。涵盖文本分类、命名实体识别、机器翻译等核心技术,并提供实践案例,帮助读者快速掌握模型微调与部署。适合 NLP 初学者及希望深入理解 Transformer 的开发…

【论文阅读】maskformer: Per-Pixel Classification is Not All You Need for Semantic Segmentation

标题 Per-Pixel Classification is Not All You Need for Semantic Segmentation (NIPS 2021) 论文:Per-Pixel Classification is Not All You Need for Semantic Segmentation 代码:https://github.com/facebookresearch/MaskFormer 摘要 ​ 现代方法通常将语义分割视为逐…

鸿蒙特效教程04-直播点赞动画效果实现教程

鸿蒙特效教程04-直播点赞动画效果实现教程 在时下流行的直播、短视频等应用中,点赞动画是提升用户体验的重要元素。当用户点击屏幕时,屏幕上会出现飘动的点赞图标,感觉挺好玩的。本教程适合HarmonyOS初学者,通过简单到复杂的步骤,通过HarmonyOS的Canvas组件,一步步实现这…

鸿蒙特效教程02-微信语音录制动画效果实现教程

鸿蒙特效教程02-微信语音录制动画效果实现教程本教程适合HarmonyOS初学者,通过简单到复杂的步骤,一步步实现类似微信APP中的语音录制动画效果。最终效果预览 我们将实现以下功能:长按"按住说话"按钮:显示录音界面和声波动画 录音过程中显示实时时长 手指上滑:取…