acwing 845. 八数码

news/2024/11/1 12:44:24/

在一个 3×3 的网格中,1∼8 这 8 个数字和一个 x 恰好不重不漏地分布在这 3×3 的网格中。

例如:

1 2 3
x 4 6
7 5 8
在游戏过程中,可以把 x 与其上、下、左、右四个方向之一的数字交换(如果存在)。

我们的目的是通过交换,使得网格变为如下排列(称为正确排列):

1 2 3
4 5 6
7 8 x
例如,示例中图形就可以通过让 x 先后与右、下、右三个方向的数字交换成功得到正确排列。

交换过程如下:

1 2 3 1 2 3 1 2 3 1 2 3
x 4 6 4 x 6 4 5 6 4 5 6
7 5 8 7 5 8 7 x 8 7 8 x
现在,给你一个初始网格,请你求出得到正确排列至少需要进行多少次交换。

输入格式
输入占一行,将 3×3 的初始网格描绘出来。

例如,如果初始网格如下所示:

1 2 3
x 4 6
7 5 8
则输入为:1 2 3 x 4 6 7 5 8

输出格式
输出占一行,包含一个整数,表示最少交换次数。
如果不存在解决方案,则输出 −1。
输入样例:
2 3 4 1 5 x 7 6 8
输出样例
19

思路:
求最少交换次数, 我们可以将二维坐标的其实状态看成树的根节点,然后需要找到走到结束状态的最短的走法。本质上是求最短距离。

求最短距离: 我们需要想到BFS

按照之前学习BFS 的思路:需要有队列保存不同的状态,有一个距离数据存储到哪个状态走了多少步

难点:

  1. 如何把状态存储在队列中
  2. 如何记录状态距离

解决方案:直接用字符串进行存储不同的状态

  • queue<string> q 保存不同的状态
  • unordered_map<string, int> dist 哈希表存储到不同状态的步数

代码实现:

// 数字华容道    
#include <iostream>
#include <queue>
#include <unordered_map>
#include <string>using namespace std;int bfs(string start)
{string end = "12345678x";queue<string> q;unordered_map<string ,int> dist;q.push(start);dist[start] = 0;int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};while(q.size()){auto t = q.front();q.pop();int distance = dist[t];if ( t == end) return distance;// 状态转移int k = t.find('x');int x = k / 3, y = k % 3;   // 通过位置找到二维坐标for(int i = 0; i < 4; i ++){int a = x + dx[i], b = y + dy[i];if(a >= 0 && a < 3 && b >= 0 && b < 3){swap(t[k], t[a * 3 + b]);   // 通过坐标找打一维位置if(!dist.count(t)){dist[t] = distance + 1;q.push(t);}swap(t[k], t[a * 3 + b]);}}}return -1;
}int main()
{string start;for(int i =0; i < 9; i ++){char c;cin >> c;start += c;}// cout << start << endl;cout << bfs(start) << endl;return 0;
}

http://www.ppmy.cn/news/232596.html

相关文章

我和我的845

我和845在一起已经正好一个月了,这期间我对它的破坏可谓惨不忍睹.但还好,最后还剩下一点成果,安装xp和redhat9.0,应用软件,杀毒软件也安好了,如果要用的话,一般不会出太大的问题,只要不让它做太严重的事情就好.上网嘛,现在还不行,不知为什么,时快时慢的,各种设置我都尝试过的,还…

未来人类T5-散热改造final版

夏天就要到了&#xff0c;作为一个烤机党&#xff0c;我表示压力山大。。。 虽然玩游戏时散热表现跟普通游戏本比还是不错的&#xff0c; 但是单烤FPU还是直接冲上了97℃&#xff0c;至于原因嘛。。。。 因为。。。 Clevo设计师脑子进shit了&#xff01;&#xff01;&#xff0…

考研 | 南京大学 2020 计算机 845 考研感想

写在前面 2019.12.21-12.22 2020全国硕士研究生招生考试初试已经结束&#xff0c;总觉得应该写点什么。 关于考研的初衷 记得之前在 GitHub 上找资料的时候偶然发现了一篇 2019 NJU CS 考研上岸 的经验贴&#xff0c;对这位学长关于考研初衷的想法非常有感触。 大部分人都是有…

鼠标打飞碟(物理引擎)

改进鼠标打飞碟 1. 游戏要求 1.按照adapter模式设计图修改飞碟游戏。 2.使它同时支持物理运动与运动学运动。 adapter模式&#xff1a;将一个类的接口转换成客户希望的另外一个接口&#xff0c;使得原本由于接口不兼容而不能一起工作的那些类能一起工作。 其UML图如下所示…

微型计算机代表性机型,接下的旗舰机型将能频繁看到它!高通骁龙845解析

高通在2017年第一季度发布了旗舰骁龙835&#xff0c;随后各大厂商的旗舰机型&#xff0c;尤其是后续的全面屏旗舰机型几乎都纷纷采用了这一高性能手机芯片。仅仅在8、9个月之后&#xff0c;搭载骁龙835的机型还远未大量普及到消费者手里时&#xff0c;高通却又在2017年底发布了…

户外运动耳机推荐、这几款性能超强的户外运动耳机不可错过

在户外跑步的时候&#xff0c;也有不少朋友会选择戴上耳机&#xff0c;用音乐来”调味“&#xff0c;让跑步的过程不那么枯燥乏味。凡事有利就有弊&#xff0c;跑步时听音乐也如此&#xff0c;它的弊端之一是可能会有安全隐患。如果跑步时耳机音量开得太大&#xff0c;可能会忽…

雷神黑武士5代shark评测

黑武士5代shark依旧是一款超大型主机&#xff0c;前端采用了磁吸式的鲨齿菱纹格栅面板&#xff0c;独特的鲨鱼齿倒三角结构结构设计&#xff0c;一方面可以增加整体结构的强度&#xff0c;另一方面则有助于增强风道的通风力度&#xff0c;相比普通前面板散热效率提升2倍。 机箱…

高通发布骁龙845详细解读!

通技术峰会第二日&#xff0c;高通公司再次亮相骁龙845处理器。今日&#xff0c;针对这枚处理器做了更多讲解。 “1999年推出第一款3G手机&#xff0c;2007年第一款使用骁龙处理器手机诞生。”从3G时代开始高通不断深入&#xff0c;到如今4G已经站到了通信行业的巅峰。在刚刚过…