[蓝桥杯][历届试题]九宫重排-双向bfs和map标记

题目描述
如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着。与空格子相邻的格子中的卡片可以移动到空格中。经过若干次移动,可以形成第二个图所示的局面。

在这里插入图片描述

我们把第一个图的局面记为:12345678.
把第二个图的局面记为:123.46758
显然是按从上到下,从左到右的顺序记录数字,空格记为句点。
本题目的任务是已知九宫的初态和终态,求最少经过多少步的移动可以到达。如果无论多少步都无法到达,则输出-1。
输入
输入第一行包含九宫的初态,第二行包含九宫的终态。
输出
输出最少的步数,如果不存在方案,则输出-1。
样例输入
12345678.
123.46758
样例输出
3

普通的bfs超时了,只能拿67分。
代码如下:

#include <iostream>
#include <queue>
#include <map>
using namespace std;
int mp[4][4];
map<int, int>vis;
map<int, int>st; //step
int target  = 0;
int row, col;int dx[] = {0, 0, 1, -1}, dy[] = {1, -1, 0, 0};bool move_can(int u, int d) {for (int i = 2; i >= 0; i--)for (int j = 2; j >= 0; j--) {mp[i][j] = u % 10;u = u / 10;if (mp[i][j] == 0) {row = i;col = j;}}if ((d == 0 && col == 2) || (d == 1 && col == 0) || (d == 2 && row == 2) || (d == 3 && row == 0))return false;return true;
}int move_to(int u, int d) {int xx = row + dx[d];int yy = col + dy[d];mp[row][col] = mp[xx][yy];mp[xx][yy] = 0;int tmp = 0;for (int i = 0; i < 3; i++)for (int j = 0; j < 3; j++) {tmp = tmp * 10 + mp[i][j];}return tmp;
}int bfs(int s) {queue<int>q;vis[s] = 1;st[s] = 0;q.push(s);while (q.size()) {int t = q.front();q.pop();if (t == target)return st[t];for (int i = 0; i < 4; i++) {if (move_can(t, i)) {int v = move_to(t, i);if (!vis[v]) {vis[v] = 1;st[v] = st[t] + 1;q.push(v);}}}}return -1;
}int main() {int state = 0;for (int i = 0; i < 3; i++)for (int j = 0; j < 3; j++) {char c;cin >> c;if (c >= '1' && c <= '8')mp[i][j] = c - '0';elsemp[i][j] = 0;state = state * 10 + mp[i][j];}for (int i = 0; i < 9; i++) {char c;cin >> c;if (c >= '1' && c <= '8')target = target * 10 + (c - '0');else {int tmp = 0;target = target * 10 + tmp;}}cout << bfs(state) << endl;return 0;
}

然后我采用了双向bfs,然后ac了!

代码如下:

#include <iostream>
#include <queue>
#include <map>
using namespace std;
char c;
map<int, int>vis;
map<int, int>dis;
int mp[4][4];int dx[] = {0, 0, 1, -1}, dy[] = {1, -1, 0, 0};
int nx, ny;
int ans;void fff1(int s) {int div = 100000000;for (int i = 0; i < 3; i++)for (int j = 0; j < 3; j++) {mp[i][j] = (s / div) % 10;if (mp[i][j] == 0) {nx = i;ny = j;}div = div / 10;}
}int fff2() {int tmp = 0;for (int i = 0; i < 3; i++)for (int j = 0; j < 3; j++) {tmp = tmp * 10 + mp[i][j];}return tmp;
}int dbfs(int s, int e) {if (s == e)return 0;queue<int>q1, q2;q1.push(s), q2.push(e);vis[s] = 1, vis[e] = 2;dis[s] = 0, dis[e] = 1;while (q1.size() && q2.size()) {int t;bool flag;if (q1.size() < q2.size()) {t = q1.front();q1.pop();flag  = 1;} else {t = q2.front();q2.pop();flag = 0;}fff1(t);for (int i = 0; i < 4; i++) {int xx = nx + dx[i], yy = ny + dy[i];if (xx >= 0 && xx < 3 && yy >= 0 && yy < 3) {swap(mp[xx][yy], mp[nx][ny]);int v = fff2();if (!dis.count(v)) {dis[v] = dis[t] + 1;vis[v] = vis[t];if (flag)q1.push(v);elseq2.push(v);} else if (vis[v] + vis[t] == 3) {ans = dis[v] + dis[t];return ans;}swap(mp[xx][yy], mp[nx][ny]);}}}return -1;
}int main() {int s = 0;int e = 0;for (int i = 0; i < 9; i++) {cin >> c;if (c == '.')c = '0';s = s * 10 + (c - '0');}for (int i = 0; i < 9; i++) {cin >> c;if (c == '.')c = '0';e = e * 10 + (c - '0');}cout << dbfs(s, e) << endl;return 0;
}

在这里插入图片描述

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

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

相关文章

3月数据库排行:前10整体下行,出新技术了?

DB-Engines 数据库流行度排行榜 3 月更新已发布&#xff0c;排名前二十如下&#xff1a;排名方面没有任何变动&#xff08;仅针对前十&#xff09;&#xff0c;相信很长一段时间内也都不会变动&#xff0c;毕竟巨头的位置不是一时半刻就能动摇的。不过这个月的排行榜还是有值得…

每日一题——LeetCode160.相交链表

个人主页&#xff1a;白日依山璟 专栏&#xff1a;Java|数据结构与算法|每日一题 文章目录 1. 题目描述示例1&#xff1a;示例2&#xff1a;提示&#xff1a; 2. 思路3. 代码 1. 题目描述 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的…

.NET Core的HttpClient连接池管理

译者荐语&#xff1a;使用.NET Core的HttpClient连接池管理有哪些注意事项&#xff1f;本文给出了非常中肯的建议。原文来自互联网&#xff0c;由长沙DotNET技术社区编译。如译文侵犯您的署名权或版权&#xff0c;请联系小编&#xff0c;小编将在24小时内删除。本文来源[1]史蒂…

[蓝桥杯][2014年第五届真题]兰顿蚂蚁-模拟

题目描述 兰顿蚂蚁&#xff0c;是于1986年&#xff0c;由克里斯兰顿提出来的&#xff0c;属于细胞自动机的一种。 平面上的正方形格子被填上黑色或白色。在其中一格正方形内有一只“蚂蚁”。 蚂蚁的头部朝向为&#xff1a;上下左右其中一方。 蚂蚁的移动规则十分简单&#…

.NET Core开发实战(第17课:为选项数据添加验证:避免错误配置的应用接收用户流量)--学习笔记...

17 | 为选项数据添加验证&#xff1a;避免错误配置的应用接收用户流量三种验证方法1、直接注册验证函数2、实现 IValidateOptions3、使用 Microsoft.Extensions.Options.DataAnnotations延用上一节代码需要添加验证的时候不能用 Configure&#xff0c;而用 AddOptions 方法//se…

分支程序与循环程序设计-汇编实验二

DATA SEGMENT ;定义数据段BUF DB -1, 20, 3, 30, -5, 15, 100, -54, 0, 4, 78, 99DB -12, 32, 3, 23, -7, 24, 60,-51 ;定义比较大小的数据DATA ENDS ;数据段结束ESEG SEGMENT ;定义附加段RES1 DB 0;定义结果存放区RES2 DB 0RES3 DB 0 ESEG ENDS ;附加段结束CODE SEGMENT ;定义…

[蓝桥杯][2013年第四届真题]剪格子-dfs

题目描述 历届试题 剪格子 时间限制&#xff1a;1.0s 内存限制&#xff1a;256.0MB 问题描述 如下图所示&#xff0c;3 x 3 的格子中填写了一些整数。 我们沿着图中的星号线剪开&#xff0c;得到两个部分&#xff0c;每个部分的数字和都是60。 本题的要求就是请你编程判定&a…

使用有序GUID:提升其在各数据库中作为主键时的性能

原文出处&#xff1a;https://www.codeproject.com/articles/388157/guids-as-fast-primary-keys-under-multiple-database &#xff0c;避免今后忘记了再去阅读原英文。【】是感觉理解有问题的地方正确的使用有序GUID在大部分数据库中可以获得和 整型作为主键 时相媲美的性能。…

串操作指令及其应用程序的设计与调试运行——汇编实验四 用8086汇编完成下题 编制一程序,从键盘输入两个长度不同的字符串,设字符串长度小于25个字符。要求在屏幕上以右边对齐的形式显示出

文章目录实验目的和内容实验要求和步骤实现右对齐以下为源码&#xff1a;方法一方法二方法三测试一——字符串的输入输出测试二——改进测试三——改进测试四——改进实验目的和内容 实验要求和步骤 实现右对齐 以下为源码&#xff1a; 方法一 DATA SEGMENTNUM EQU 25BUF1 D…

selenium.common.exceptions.WebDriverException: Message: ‘chromedriver‘ executable needs to bein PATH

使用Selenium模拟浏览器访问淘宝首页&#xff0c;出现报警 from selenium import webdriver import timebrowser webdriver.Chrome() browser.get(https://www.taobao.com) time.sleep(2) print(browser.page_source)selenium.common.exceptions.WebDriverException: Message…

【朝夕技术专刊】Core3.1WebApi_Filter详解

欢迎大家阅读《朝夕Net社区技术专刊》第4期我们致力于.NetCore的推广和落地&#xff0c;为更好的帮助大家学习&#xff0c;方便分享干货&#xff0c;特创此刊&#xff01;很高兴你能成为忠实读者&#xff0c;文末福利不要错过哦&#xff01;01PARTCoreWebApi五大Filter1. Autho…

统计学习方法 pdf_机器学习基础教材-《统计学习与数据分析介绍》免费pdf分享...

本书介绍本入门级统计教科书主要讲解发展和培养统计思维所需的基本概念和工具。它提供了描述性&#xff0c;归纳性和探索性的统计方法&#xff0c;并指导读者完成定量数据分析的过程。在实验科学和跨学科研究中&#xff0c;数据分析已成为任何科学研究的组成部分。诸如判断数据…

selenium.common.exceptions.SessionNotCreatedException: Message: session not created全套解决方案

chromedriver版本不匹配 报错&#xff1a; selenium.common.exceptions.SessionNotCreatedException: Message: session not created selenium.common.exceptions.WebDriverException: Message: session not created: 原因&#xff1a; Chrome版本和ChromeDriver版本不一致…

.NET Core开发实战(第18课:日志框架:聊聊记日志的最佳姿势)--学习笔记(上)...

18 | 日志框架&#xff1a;聊聊记日志的最佳姿势源码链接&#xff1a;https://github.com/witskeeper/geektime/tree/master/samples/LoggingSimpleDemo日志框架必要的包&#xff1a;1、Microsoft.Extensions.Logging2、Microsoft.Extensions.Logging.Console3、Microsoft.Exte…

Istio 1.5 发布——拥抱变化,爱上单体

北京时间 2020 年 3 月 6 日凌晨&#xff0c;我们期待已久的 Istio 1.5 发布了&#xff0c;发布公告见 https://istio.io/news/releases/1.5.x/announcing-1.5/。由 ServiceMesher 社区组织翻译的 Istio 官方文档同时发布&#xff0c;见 https://istio.io/zh。Istio 1.5 是一个…

hbuilderx怎么添加断点_【高考语文题库】高考一直提分提不上去该怎么办?同一卷高考押题语文答案,助你再提30分...

大树从来不是在温室里长成的&#xff0c;而是在风霜雪雨的洗礼中参天的……古语云&#xff1a;“工欲善其事&#xff0c;必先利其器。”俗话说&#xff1a;“磨刀不误砍材工。”用到学习上就是学习必须讲究学习方法&#xff0c;有了适合自己的有效学习方法必定会事半功倍。一个…

业务模块化打造单体和分布式部署同步支持方案

我在2019年中国.NET开发者峰会上为大家分享了我们的微服务电商安全工程实践&#xff0c;那次会议分享的高清录播已经上传到我的腾讯课堂&#xff0c;大家可以通过底部的小程序打开直接观看&#xff08;复习&#xff09;。在大会上跟大家提到&#xff0c;我们当时只有4个人的创业…

Asp.Net Core EndPoint 终结点路由工作原理解读

Asp.Net Core EndPoint 终点路由工作原理解读一、背景在本打算写一篇关于Identityserver4 的文章时候&#xff0c;却发现自己对EndPoint -终结点路由还不是很了解&#xff0c;故暂时先放弃了IdentityServer4 的研究和编写&#xff1b;所以才产生了今天这篇关于EndPoint (终结点…

[蓝桥杯][算法提高VIP]夺宝奇兵-dp

题目描述 在一座山上,有很多很多珠宝,它们散落在山底通往山顶的每条道路上,不同道路上的珠宝的数目也各不相同.下图为一张藏宝地图: 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 ”夺宝奇兵”从山下出发,到达山顶,如何选路才能得到最多的珠宝呢?在上图所示例子中,按照5-> 7-> 8-&g…

迁移到其他机器_有赞大数据离线集群迁移实战

‍‍点击关注“有赞coder”获取更多技术干货哦&#xff5e;作者&#xff1a;郭理想 & 任海潮部门&#xff1a;数据中台一、背景有赞是一家商家服务公司&#xff0c;向商家提供强大的基于社交网络的&#xff0c;全渠道经营的 SaaS 系统和一体化新零售解决方案。随着近年来社…