Acwing八数码

此题用bfs

首先我们可以定义两个重要的数组

unordered_map<string,int>d表示string距离start的交换次数

queue<string>q广搜数组

然后我们初始化后进行三个操作

1.将一维的坐标转化为二维的坐标(x=k/3,y=k%3k表示一维中的位置)

2.进行向4个方向搜索,交换一次,如果没有变成过这样的状态,那么就更新。

3.恢复状态。

当变为目标状态"12345678x"时,输出d[12345678x]即可

#include <iostream> #include <cstring> #include <algorithm> #include <unordered_map> #include <queue> using namespace std; int bfs(string start) { string end = "12345678x"; unordered_map<string,int> d;//记录状态距离 queue<string> q;//队列 q.push(start); d[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 dis = d[t]; if(t == end) return dis; //状态转移 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(!d.count(t)) { d[t] = dis + 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 ch; cin >> ch; start += ch; } cout << bfs(start) << endl; return 0; }

__EOF__

本文作者ljfyyds
本文链接https://www.cnblogs.com/ljfyyds/p/16488229.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   ljfyyds  阅读(31)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示