1107. 魔板(BFS,最小步数模型,unordered_map哈希)

1107. 魔板 - AcWing题库

Rubik 先生在发明了风靡全球的魔方之后,又发明了它的二维版本——魔板。

这是一张有 8 个大小相同的格子的魔板:

1 2 3 4
8 7 6 5

我们知道魔板的每一个方格都有一种颜色。

这 8 种颜色用前 8 个正整数来表示。

可以用颜色的序列来表示一种魔板状态,规定从魔板的左上角开始,沿顺时针方向依次取出整数,构成一个颜色序列。

对于上图的魔板状态,我们用序列 (1,2,3,4,5,6,7,8) 来表示,这是基本状态。

这里提供三种基本操作,分别用大写字母 A,B,C 来表示(可以通过这些操作改变魔板的状态):

A:交换上下两行;
B:将最右边的一列插入到最左边;
C:魔板中央对的4个数作顺时针旋转。

下面是对基本状态进行操作的示范:

A:

8 7 6 5
1 2 3 4

B:

4 1 2 3
5 8 7 6

C:

1 7 2 4
8 6 3 5

对于每种可能的状态,这三种基本操作都可以使用。

你要编程计算用最少的基本操作完成基本状态到特殊状态的转换,输出基本操作序列。

注意:数据保证一定有解。

输入格式

输入仅一行,包括 8 个整数,用空格分开,表示目标状态。

输出格式

输出文件的第一行包括一个整数,表示最短操作序列的长度。

如果操作序列的长度大于0,则在第二行输出字典序最小的操作序列。

数据范围

输入数据中的所有数字均为 1 到 8 之间的整数。

输入样例:
2 6 8 4 5 7 3 1
输出样例:
7
BCABCCB

解析 :

更其他得BFS没什么区别,只是用unordered_map 来记录,因为字符串无法使用 int 或 long long 得数组记录

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<math.h>
#include<map>
#include<unordered_map>using namespace std;
typedef long long LL;
char g[2][4];
unordered_map<string, pair<char, string>>pre;
unordered_map<string, int>d;void make(string t) {for (int i = 0; i < 4; i++)g[0][i] = t[i];for (int i = 3, a = 4; i >= 0; i--,a++)g[1][i] = t[a];
}string get() {string ret;for (int i = 0; i < 4; i++) {ret += g[0][i];}for (int i = 3; i >= 0; i--) {ret += g[1][i];}return ret;
}string move3(string t) {make(t);char t1 = g[0][1];g[0][1] = g[1][1];g[1][1] = g[1][2];g[1][2] = g[0][2];g[0][2] = t1;return get();
}string move2(string t) {make(t);char t1 = g[0][3];char t2 = 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] = t1;g[1][0] = t2;return get();
}string move1(string t) {make(t);for (int i = 0; i < 4; i++) {swap(g[0][i], g[1][i]);}return get();
}int bfs(string start, string end) {d[start] = 0;queue<string>q;q.push(start);while (!q.empty()) {string t = q.front();if (t == end)return d[t];q.pop();string m1 = move1(t);string m2 = move2(t);string m3 = move3(t);if (!d.count(m1)) {d[m1] = d[t] + 1;pre[m1] = { 'A',t };q.push(m1);}if (!d.count(m2)) {d[m2] = d[t] + 1;pre[m2] = { 'B',t };q.push(m2);}if (!d.count(m3)) {d[m3] = d[t] + 1;pre[m3] = { 'C',t };q.push(m3);}}
}int main() {string end;for (int i = 1, a; i <= 8; i++) {scanf("%d", &a);end += a + '0';}string start;for (int i = 1; i <= 8; i++) {start += i + '0';}int ans=bfs(start, end);cout << ans << endl;string s,t=end;while (t != start) {s += pre[t].first;t = pre[t].second;}reverse(s.begin(), s.end());if(ans)cout << s << endl;return 0;
}

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

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

相关文章

C语言面试之旅:掌握基础,探索深度(面试实战之ARM架构二)

读别人的代码&#xff0c;就像撕洋葱&#xff0c;每读一层&#xff0c;哭一遍。 引言 ARM 处理器是冯诺依曼存储结构&#xff0c;程序空间、RAM 空间及IO 映射空间统一编址&#xff0c;除对对RAM 操作以外&#xff0c;对外围IO、程序数据的访问均要通过加载/存储指令进…

介绍 Agency: 使AI与Go语言无缝对接

关注公众号【爱发白日梦的后端】分享技术干货、读书笔记、开源项目、实战经验、高效开发工具等&#xff0c;您的关注将是我的更新动力&#xff01; 在当今应用开发领域&#xff0c;类似OpenAI API等生成式AI技术的蓬勃发展正在彻底改变着应用开发的格局。Python和JavaScript等语…

App内存优化

一、内存优化介绍 1.背景介绍 内存是大问题但缺乏关注压实骆驼的最后一个稻草&#xff08;堆栈溢出&#xff09; 2.内存问题 内存抖动&#xff1a;锯齿状、GC导致卡顿内存泄露&#xff1a;可用内存减少、频繁GC内存溢出&#xff1a;OOM&#xff0c;程序异常 二、优化工具选…

小程序的分包加载具体流程

在小程序项目的 app.json 文件中配置分包信息。通过设置 subpackages 字段&#xff0c;指定每个分包的根目录路径和分包的名称。 "subpackages": [{"root": "subpackage1","name": "subpackage1"},{"root": &quo…

FreeRTOS简介

FreeRTOS简介 文章目录 FreeRTOS简介前言一、什么是FreeRTOS&#xff1f;二、FreeRTOS的特点三、FreeRTOS的版本和参考资料1、FreeRTOS版本2、FreeRTOS源码获取3、FreeRTOS参考资料 四、FreeRTOS源码简介 前言 FreeRTOS是一个可以基于ROM运行的、可裁剪的、抢占式、实时多任务…

Photoshop最新版PS2024安装使用 Ver25.0.0

Photoshop&#xff0c;这个是长红了几十年的软件&#xff0c;我大概从它的3.0版本开始用&#xff0c;目前已迭代到25.0&#xff0c;但一直还在用CS4/11.0版本&#xff0c;一直秉持着够用即可的原则&#xff0c;因为不是专业的平面设计人员&#xff0c;能够简单PP图片就行。&…

C++智能指针及简单实现

C智能指针 堆内存、栈内存与静态内存静态内存栈内存堆内存 动态内存管理new、delete运算符智能指针实现智能指针 shared_ptr智能指针的线程安全问题解决 unique_ptrweak_ptr循环引用 思维导图本模块思路 动态内存管理 - cppreference.com 堆内存、栈内存与静态内存 静态内存 …

视觉测量基础

1. 相机模型 1.1 坐标系转换原理 世界坐标系(world Coords):点在真实世界中的位置&#xff0c;描述相机位置。 相机坐标系(Cameras Coords):以相机光学系统中心&#xff08;镜头中心&#xff09;为原点&#xff0c;建立相机坐标系。 图像物理坐标系(Film Coords):经过小孔成…

21 俄罗斯套娃信封问题

问题描述&#xff0c;给你一个二维数组envelopes&#xff0c;其中envelopes[i][wi,hi].表示第i个信封的宽度和高度&#xff0c;当另一个信封的宽度和噶度都比这个信封大的时候就可以放进另一个信封里&#xff0c;如同俄罗斯套娃一样。请计算最多能有多少个信封能组成一套“俄罗…

Debugging Application Engine Programs 调试应用程序引擎程序

Debugging Application Engine Programs 调试应用程序引擎程序 This section discusses how to: 本节讨论如何&#xff1a; Enable the Application Engine debugger.启用应用程序引擎调试器。Set debugging options.设置调试选项。 Enabling the Application Engine Debu…

Java数组面试题

Java数组面试题 1. 创建一个包含多个元素的数组&#xff0c;并打印输出数组的内容。 public class Main {public static void main(String[] args) {String[] array {"apple", "banana", "orange"};for (String element : array) {System.out…

微服务实战系列之J2Cache

前言 经过近几天陆续发布Cache系列博文&#xff0c;博主已对业界主流的缓存工具进行了基本介绍&#xff0c;当然也提到了一些基本技巧。相信各位盆友看见这么多Cache工具后&#xff0c;在选型上一定存在某些偏爱: A同学说&#xff1a;不管业务千变万化&#xff0c;我对Redis的…

【华为OD题库-070】数列描述-java

题目 题目描述: 有一个数列A[n]&#xff0c;从A[0]开始每一项都是一个数字&#xff0c;数列中A[n1]都是A[n]的描述&#xff0c;其中A[0]1&#xff0c;规则如下; A[0]:1 A[1]:11 含义其中A[0]1是1个1即11&#xff0c;表示A[0]从左到右连续出现了1次1 A[2]:21 含义其中A[1]11是2个…

企业如何制定精准营销策略?

在当今的数字化时代&#xff0c;位置数据已经成为企业营销策略中不可或缺的一部分。通过收集和分析客户的位置数据&#xff0c;企业可以更好地了解客户的行为和需求&#xff0c;制定更精准的营销策略&#xff0c;从而提高营销效率。 首先&#xff0c;利用IP地址位置数据可以帮助…

手搓图片滑动验证码_JavaScript进阶

手搓图片滑动验证码 背景代码效果图展示网站 背景 在做前端项目开发的时候&#xff0c;少不了登录注册部分&#xff0c;既然有登录注册就少不了机器人验证&#xff0c;验证的方法有很多种&#xff0c;比如短信验证码、邮箱验证码、图片滑动、图片验证码等。 由于鄙人在开发中…

9个Logo素材超多的Logo网站!

Logo 虽然看起来很简单&#xff0c;但是设计过程中的每一个细节都很精致。因为 Logo 作为品牌的象征&#xff0c;应该一目了然地传达给人们品牌的理念和形象。本文给大家整理了 7 个 Logo 素材网站和 2 个 Logo 在线制作网站。可以收集很多关 Logo 设计的内容和技巧&#xff01…

吉他初学者学习网站搭建系列(5)——如何做一个在线节拍器

文章目录 背景实现TransportLoop代码 在线尝试 背景 我们看吉他谱时&#xff0c;经常看到拍号&#xff0c;例如6/8。它的含义是一拍是一个八分音符&#xff0c;一小节有六拍。四分音符的时长是一秒&#xff0c;即60拍/分钟。基于这样的背景知识&#xff0c;我们就可以根据一些…

决策树 C4.5算法

C4.5算法 C4.5算法 C4.5 算法是 Ross 对ID3 算法的改进用信息增益率来选择属性。ID3选择属性用的是子树的信息增益而C4.5用的是信息增益率在决策树构造过程中进行剪枝对非离散数据也能处理能够对不完整数据进行处理 信息增益比&#xff08;C4.5&#xff09; g R ( D , A ) …

Leetcode 第 110 场双周赛 Problem D 2809. 使数组和小于等于 x 的最少时间(DP+贪心+正难则反)

Leetcode 第 110 场双周赛 Problem D 2809. 使数组和小于等于 x 的最少时间&#xff08;DP 好题&#xff09;题目 给你两个长度相等下标从 0 开始的整数数组 nums1 和 nums2 。每一秒&#xff0c;对于所有下标 0 < i < nums1.length &#xff0c;nums1[i] 的值都增加 num…

supervisor管理python进程

前言 平时开发调试中使用conda环境&#xff0c;项目比较多环境多&#xff0c;而且命令繁杂&#xff0c;每一次启动项目都可能会因为忘记启动方式而频繁报错。现在可以通过supervisor来管理&#xff0c;只需要配置几个文件&#xff0c;就可以轻松通过简单一致的命令启动工程&…