最小步数模型——AcWing 1107. 魔板

最小步数模型

定义

最小步数模型通常是指在某种约束条件下,寻找从初始状态到目标状态所需的最少操作或移动次数的问题。这类问题广泛存在于算法、图论、动态规划、组合优化等领域。具体来说,它涉及确定一个序列或路径,使得按照特定规则执行一系列步骤后,能够从起始位置或状态转换到目标位置或状态,且所花费的步骤尽可能少。

运用情况

  1. 图的最短路径问题:如Dijkstra算法、Floyd-Warshall算法等,用于寻找两点间经过边的最小权重和,即最少步数。
  2. 迷宫问题:寻找从起点到终点的最短路径,每步只能上下左右移动。
  3. 跳台阶问题:一个人可以1步或2步上楼梯,求n阶楼梯有多少种不同的上法,也是求最小步数的一个变体。
  4. 爬楼梯问题:每次可以爬1阶或2阶,求达到n阶楼梯的最少步数,考虑动态规划解法。
  5. 状态转换问题:如编辑距离(将一个字符串转换为另一个字符串最少的插入、删除、替换操作次数)。

注意事项

  1. 状态定义:明确问题中的状态如何表示,状态转移方程如何建立,这是解决问题的基础。
  2. 边界条件:正确设定初始状态和目标状态,以及任何可能的限制条件,避免无限循环或错误解。
  3. 避免重复计算:在动态规划等方法中,使用记忆化技术或递推公式减少重复子问题的计算。
  4. 最优子结构:利用问题的最优子结构,即问题的最优解可以由其子问题的最优解组合得到。
  5. 复杂度控制:考虑算法的时间和空间复杂度,选择合适的算法和数据结构以提高效率。

解题思路

  1. 分析问题:明确问题的输入、输出及约束条件,识别问题的类型(如是否为最短路径、最优化问题等)。
  2. 选择模型:根据问题特征选择合适的算法模型,如贪心、动态规划、图算法等。
  3. 状态定义与转移:定义状态表示问题的某一阶段,构建状态转移方程,描述如何从一个状态转移到另一个状态。
  4. 设计算法:依据状态转移方程设计算法,可能是递归、迭代、图的遍历等。
  5. 实现与优化:编写代码实现算法,考虑边界条件和特殊情况处理,优化算法以降低时间和空间复杂度。
  6. 验证与测试:通过测试用例验证算法的正确性,确保能正确处理各种边界条件和特殊情况。

AcWing 1107. 魔板

题目描述

AcWing 1107. 魔板 - AcWing

运行代码

#include <cstring>
#include <iostream>
#include <algorithm>
#include <unordered_map>
#include <queue>using namespace std;char g[2][4];
unordered_map<string, pair<char, string>> pre;
unordered_map<string, int> dist;void set(string state)
{for (int i = 0; i < 4; i ++ ) g[0][i] = state[i];for (int i = 7, j = 0; j < 4; i --, j ++ ) g[1][j] = state[i];
}string get()
{string res;for (int i = 0; i < 4; i ++ ) res += g[0][i];for (int i = 3; i >= 0; i -- ) res += g[1][i];return res;
}string move0(string state)
{set(state);for (int i = 0; i < 4; i ++ ) swap(g[0][i], g[1][i]);return get();
}string move1(string state)
{set(state);int v0 = g[0][3], v1 = g[1][3];for (int i = 3; i > 0; i -- ){g[0][i] = g[0][i - 1];g[1][i] = g[1][i - 1];}g[0][0] = v0, g[1][0] = v1;return get();
}string move2(string state)
{set(state);int v = g[0][1];g[0][1] = g[1][1];g[1][1] = g[1][2];g[1][2] = g[0][2];g[0][2] = v;return get();
}int bfs(string start, string end)
{if (start == end) return 0;queue<string> q;q.push(start);dist[start] = 0;while (!q.empty()){auto t = q.front();q.pop();string m[3];m[0] = move0(t);m[1] = move1(t);m[2] = move2(t);for (int i = 0; i < 3; i ++ )if (!dist.count(m[i])){dist[m[i]] = dist[t] + 1;pre[m[i]] = {'A' + i, t};q.push(m[i]);if (m[i] == end) return dist[end];}}return -1;
}int main()
{int x;string start, end;for (int i = 0; i < 8; i ++ ){cin >> x;end += char(x + '0');}for (int i = 1; i <= 8; i ++ ) start += char('0' + i);int step = bfs(start, end);cout << step << endl;string res;while (end != start){res += pre[end].first;end = pre[end].second;}reverse(res.begin(), res.end());if (step > 0) cout << res << endl;return 0;
}

代码思路

  1. 状态表示:用一个长度为8的字符串表示矩阵的状态,前四位表示第一行,后四位逆序表示第二行。
  2. 状态转换:定义了三种状态转换函数move0move1move2,分别对应三种操作。
  3. 广度优先搜索:使用BFS从初始状态开始搜索,利用一个队列来存储待探索的状态,一个哈希表dist记录每个状态到初始状态的最小步数,另一个哈希表pre记录每个状态的前驱状态和对应的操作。
  4. 路径回溯:当找到目标状态时,通过pre哈希表回溯并构造出从初始状态到目标状态的操作序列。

改进思路

  1. 减少空间消耗:使用迭代而非递归来保存路径,可以减少递归调用栈的空间消耗。
  2. 剪枝:在BFS过程中,可以添加剪枝策略,如遇到已经访问过且步数更优的状态时直接跳过,避免重复探索。
  3. 输入验证:在读取目标状态时增加输入验证,确保输入是合法的(例如,确保是0和1组成,且0和1的数量符合要求)。
  4. 优化状态表示:直接使用整型或位操作来表示状态,可能在某些情况下减少内存使用和加快状态比较速度。
  5. 清晰的函数命名和注释:增加函数和关键变量的注释,使代码更易于理解和维护。

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

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

相关文章

jenkins在使用pipeline时,为何没有方块形视图

项目场景&#xff1a; 安装完Jenkins时后&#xff0c;通过pipeline创建的项目任务。 问题描述 在立即构建后&#xff0c;没有显示每个阶段的视图。 原因分析&#xff1a; 原因是&#xff0c;刚安装的Jenkins&#xff0c;这个视图不是Jenkins自带的功能&#xff0c;而必须安装…

EDA 虚拟机 Synopsys Sentaurus TCAD 2017.09 下载

下载地址&#xff08;制作不易&#xff0c;下载使用需付费&#xff0c;不能接受的请勿下载&#xff09;&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1327I58gvV1usWSqSrG7KXw?pwdo03i 提取码&#xff1a;o03i

Boss直聘,无良厂商,乱封号

耽误招工作&#xff0c;瞎吉儿封号 哥们单身 需要女生多的公司 问一下都不行&#xff0c;什么尿性 直接就给你封了 装什么呢 辣鸡boss 倒闭吧赶紧 我是狗子&#xff0c;希望你倒闭&#xff01;

Radxa 学习摘录

文章目录 1、参考资料2、硬件知识CIF 和 ISP 3、shell4、交叉编译工具链5、问题6、DTS7、驱动 1、参考资料 技术论坛&#xff08;推荐&#xff09; 官方资料下载 wiki资料 u-boot 文档 u-boot 源码 内核文档 内核源码 原理图 radxa-repo radxa-build radxa-pkg radxa-doc…

寻找最适合你的交易风格

与Eagle Trader一起&#xff0c;您将拥有一位坚不可摧的合作伙伴&#xff0c;为您的交易之路增添坚实信心&#xff0c;并重塑交易体验的每一个细节。我们量身定制的交易环境&#xff0c;更能让您精准捕捉并驾驭符合您独特交易风格的卓越条件&#xff0c;让交易之旅更加自由畅快…

Python容器 之 字典--定义

1.字典的介绍 1, 字典 dict, 使用 {} 表示 2, 字典是由键(key)值(value)对组成的, key: value 3, 一个键值对是一组数据, 多个键值对之间使用 逗号隔开 4, 在一个字典中, 字典的键 是不能重复的&#xff0c;如果重复原数据会被覆盖 5, 字典中的键 主要使用 字符串类型, 可以是…

Mac可以卸载掉系统自带的软件吗 Mac第三方软件无法卸载是为什么

在使用Mac电脑时&#xff0c;有时候我们会发现系统预装的一些应用并不常用或者不符合个人需求&#xff0c;想要将它们卸载掉。然而&#xff0c;对于系统自带的软件&#xff0c;卸载并不简单&#xff0c;需要谨慎对待以免影响系统稳定性和功能正常运行。下面我们来看看Mac可以卸…

Firefox 编译指南2024 Windows10-使用Git 管理您的Firefox(五)

1. 引言 在现代软件开发中&#xff0c;版本控制系统&#xff08;VCS&#xff09;是不可或缺的工具&#xff0c;它不仅帮助开发者有效管理代码的变化&#xff0c;还支持团队协作与项目管理。Mercurial 是一个高效且易用的分布式版本控制系统&#xff0c;其设计目标是简洁、快速…

【antd + vue】表格行合并,同时使用插槽

一、需求说明 表格中&#xff0c;如果一个学校有多个考试科目&#xff0c;则分行展示&#xff0c;其余列&#xff0c;则合并为一行展示&#xff0c;如图所示 二、需求分析 1、表格行合并 相当于有4行&#xff0c;其中1、2行是同一个学校包含不同考试科目及对应人次的数据&am…

手机数据恢复篇:如何在恢复出厂设置后的 iPhone 恢复短信

您可能会认为&#xff0c;在恢复出厂设置iPhone后恢复短信时&#xff0c;一切都会丢失&#xff0c;但是仍然有一些方法可以检索您的重要对话。截至 2024 年&#xff0c;数据恢复技术的进步使得从备份甚至直接从设备内存中抢救消息变得更加容易。无论是通过 iCloud、iTunes 还是…

LeetCode Hard|124.二叉树中的最大路径和

力扣题目链接 题目解读&#xff1a; 二叉树路径的定义即从1.任意节点出发&#xff0c;到达任意节点&#xff1b;2.该路径至少包含一个节点&#xff0c;且不一定经过跟节点&#xff1b;3.求所有可能路径和的最大值。 也就是说路径途径一个节点只能选择来去两个方向 考虑一个二叉…

2025年U.S.News世界大学排名前200榜单

近日&#xff0c;U.S. News公布了2025全球最佳院校排名&#xff0c;作为公认的四大世界高校排行榜&#xff0c;该排名主要围绕着学术声誉、学术成果等&#xff0c;因此备受访问学者、联合培养博士生及博士后申请者们青睐&#xff0c;知识人网小编特作介绍并发布排名前200的榜单…

我与C++的爱恋:list的使用

​ ​ &#x1f525;个人主页&#xff1a;guoguoqiang. &#x1f525;专栏&#xff1a;我与C的爱恋 一、list介绍 1.list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代 2.list的底层是双向链表结构&#xff0c;双向链表中…

西电811考研、140分专业课及811/821经验

被拟录取了&#xff0c;说一说自己考研经验&#xff0c;本人跟的研梦考研全程班&#xff0c;胖覃学长很负责任&#xff0c;貌似已经直博西电了&#xff0c;但也很负责。 1、通信工程学院分为学硕与专硕&#xff0c;学硕包含信息与通信工程、交通运输工程、军队指挥学&#xff…

Linux环境安装配置nginx服务流程

Linux环境的Centos、麒麟、统信操作系统安装配置nginx服务流程操作&#xff1a; 1、官网下载 下载地址 或者通过命令下载 wget http://nginx.org/download/nginx-1.20.2.tar.gz 2、上传到指定的服务器并解压 tar -zxvf nginx-1.20.1.tar.gzcd nginx-1.20.1 3、编译并安装到…

数字化供应链:背景特点

​背景 1、外部环境 近年来&#xff0c;供应链脆弱性凸显&#xff0c;企业供应链压力难以缓解。 美国媒体针对美国零售联合会、美国服装和鞋类协会、美国供应链管理专业委员会等主体进行的一项供应链调查显示&#xff1a; 61%的供应链经理预计&#xff0c;供应链紊乱问题至少…

C++(第一天-----命名空间和引用)

一、C/C的区别 1、与C相比   c语言面向过程&#xff0c;c面向对象。   c能够对函数进行重载&#xff0c;可使同名的函数功能变得更加强大。   c引入了名字空间&#xff0c;可以使定义的变量名更多。   c可以使用引用传参&#xff0c;引用传参比起指针传参更加快&#…

企业化运维(5)_mysql数据库

###1.源码编译mysql### 对压缩包进行解压&#xff0c;并对mysql进行源码编译&#xff0c;其中需要下载依赖才能编译成功。 官网&#xff1a; www.mysql.com解压并进入目录 [rootserver1 ~]# tar xf mysql-boost-5.7.40.tar.gz [rootserver1 ~]# cd mysql-5.7.40/安装依赖性…

初识Java(复习版)

一. 什么是Java Java是一种面向对象的编程语言&#xff0c;和C语言有所不同&#xff0c;C语言是一门面向过程的语言。偏底层实现&#xff0c;比较注重底层的逻辑实现。不能一味的说某一种语言特别好&#xff0c;每一种语言都是在特定的情况下有自己的优势。 二.Java语言发展史…

昇思25天学习打卡营第2天|yulang

今天主要了解快速入门&#xff0c;主要包含了处理数据集、网络构建、模型训练、保存模型和加载模型&#xff0c;这些对于不是算法工程师理解起来可能稍微有一点的难度&#xff0c;学习起来有点枯燥&#xff0c;期待后续实战部分能完成一些独立的比较有意思的项目。