当前位置: 首页 > news >正文

八数码(bfs)

思路:

(1)用string来存储状态,用d<string,int>来记录状态变换次数;

(2)在bfs过程中,先初始化(q,d);每次拿出队头状态,得到x的相对位置,再得到x的矩阵位置,向四个方向尝试走,如果可行,就先做变换,如果该状态没被使用过即没有走回头路,就更新放入队列,另一方面维护d距离;然后恢复现场保证其余三个方向继续使用;如果所有状态都探讨完毕也没有可行解,就输出-1;

代码:

#include<bits/stdc++.h>using namespace std;int dx[] = {1,-1,0,0},dy[] = {0,0,1,-1};void bfs(string start)
{queue<string> q;unordered_map<string,int> d;string end = "12345678x";q.push(start);d[start] = 0;while(!q.empty()){string tmp = q.front();int k = tmp.find('x');q.pop();int x = k/3,y = k%3;int dis = d[tmp];if(tmp == end){cout << d[end] << endl;return;}for(int i = 0;i < 4;i ++){int tx = x + dx[i],ty = y + dy[i];if(tx >=0 && ty >= 0 && tx < 3 && ty < 3){swap(tmp[k],tmp[tx*3 + ty]);if(d.count(tmp) == 0){d[tmp] = dis + 1;q.push(tmp);}swap(tmp[k],tmp[tx*3 + ty]);}}}cout << -1<<endl;return;
}int main()
{string start;for(int i = 0;i < 9;i ++){char c;cin >> c;start = start + c;}bfs(start);return 0;
}

http://www.lryc.cn/news/121685.html

相关文章:

  • CCLINK IE FIELD BASIC转MODBUS-TCP网关cclink与以太网的区别
  • 【Rust】Rust学习 第十一章编写自动化测试
  • 关于使用pycharm遇到只能使用unittest方式运行,无法直接选择Run
  • Docker+rancher部署SkyWalking8.5并应用在springboot服务中
  • 代码随想录第45天 | 322. 零钱兑换、279. 完全平方数
  • 怎么加入Microsoft Cloud Partner Program?
  • LNMP简易搭建
  • CClink IE转Modbus TCP网关连接三菱FX5U PLC
  • PyTorch 微调终极指南:第 1 部分 — 预训练模型及其配置
  • GO学习之 微框架(Gin)
  • C语言 字符指针
  • Springboot所有的依赖
  • Flutter BottomSheet 三段式拖拽
  • php后端实现调用高德地图进行POI搜索
  • uniapp 实现滑动视图切换 顶部滚动导航栏
  • ArcGIS API for JavaScript 调用自定义地图模板总结
  • QGraphicsView实现简易地图5『经纬网格』
  • RestTemplate 请求转发异常 ERR_CONTENT_DECODING_FAILED 200 (OK)
  • 用python实现一个异或计算器
  • Sketch打不开AI文件?转换方法在这里
  • 小游戏扫雷实现教学(详解)
  • 04 mysql innodb record
  • Centos7安装Docker
  • Vue中如何更好地封装组件?
  • C语言的链表的相关操作
  • Python3中typing模块
  • C语言自动抓取淘宝商品详情网页数据,实现轻松高效爬虫
  • 数据结构---跳表
  • 为什么Tomcat的NIO在读取body时要模拟阻塞?
  • 26 | 谷歌应用APP数据分析