此题用\(bfs\)

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

\(unordered\_map<string,int> d\)表示\(string\)距离\(start\)的交换次数

\(queue<string> q\)广搜数组

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

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

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;
}

最新文章

  1. 基于Redis、Storm的实时数据查询实践
  2. [Android Pro] android 4.4 Android原生权限管理:AppOps
  3. DDD基本概念
  4. scjp考试准备 - 6 - 父类构造器的引用
  5. wpa_supplicant 连接成功后,如何配置wlan0与br0 协调上网
  6. javascript操作Math对象的方法总结
  7. 全面认识网络诊断命令功能与参数——netsh diagnostic命令
  8. ManagedPipelineHandler IIS
  9. Android上下左右滑动,显示底层布局
  10. Mac 下卸载 Graphviz
  11. 免费开源的boostrap模板
  12. Too many open files问题解决
  13. ES6系列之解构
  14. 免费的剪贴板工具Ditto安装与使用
  15. Confluence 6 创建一个项目空间
  16. (转)python-user-agents
  17. Easyradius对接WayOs维盟小区版XQ教程
  18. Window 常用系统变量
  19. Telnet远程重启路由器TP-LINK
  20. Linux工作管理

热门文章

  1. NLP教程(3) | 神经网络与反向传播
  2. 个人&amp;博客信息
  3. 字符编码,存储引擎,MySQL字段类型,MySQL字段约束条件
  4. 基础路径规划算法(Dijikstra、A*、D*)总结
  5. 好客租房25-react中的事件处理(事件对象)
  6. Java实现飞机大战游戏
  7. 【可视化分析案例】用python分析B站Top100排行榜数据
  8. 数据库常用DDL语句
  9. 六、LVM和从磁盘配额
  10. # 【由浅入深_打牢基础】WEB缓存投毒(上)