八数码问题a*算法c++

时间: 2023-12-04 11:41:20 浏览: 46
以下是使用C++实现八数码问题A*算法的代码: ```c++ #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <queue> using namespace std; const int MAXN = 1e5 + 5; const int INF = 0x3f3f3f3f; int n, m, ans; int dx[4] = {0, 0, 1, -1}; int dy[4] = {1 -1, 0, 0}; int a[3][3], b[3][3], vis[MAXN], f[MAXN], g[MAXN], h[MAXN], pre[MAXN]; struct node { int x, y, step, id; bool operator < (const node &rhs) const { return step + h[id] > rhs.step + h[rhs.id]; } }; int get_id(int a[][3]) { int res = 0; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { res = res * 10 + a[i][j]; } } return res; } void get_pos(int id, int a[][3]) { for (int i = 2; i >= 0; i--) { for (int j = 2; j >= 0; j--) { a[i][j] = id % 10; id /= 10; if (a[i][j] == 0) { n = i, m = j; } } } } int calc_h(int a[][3]) { int res = 0; for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { if (a[i][j] == 0) continue; int x = (a[i][j] - 1) / 3, y = (a[i][j] - 1) % 3; res += abs(x - i) + abs(y - j); } } return res; } void print(int id) { if (pre[id] == -1) return; print(pre[id]); int a[3][3]; get_pos(id, a); for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { printf("%d ", a[i][j]); } printf("\n"); } printf("\n"); } void A_star() { memset(vis, 0, sizeof(vis)); memset(pre, -1, sizeof(pre)); memset(f, 0x3f, sizeof(f)); memset(g, 0x3f, sizeof(g)); priority_queue<node> q; int id = get_id(a); f[id] = g[id] = 0; h[id] = calc_h(a); q.push((node){n, m, 0, id}); while (!q.empty()) { node u = q.top(); q.pop(); if (vis[u.id]) continue; vis[u.id] = 1; if (u.id == get_id(b)) { ans = u.step; return; } int x = u.x, y = u.y; for (int i = 0; i < 4; i++) { int nx = x + dx[i], ny = y + dy[i]; if (nx < 0 || nx >= 3 || ny < 0 || ny >= 3) continue; swap(a[x][y], a[nx][ny]); int id = get_id(a); if (!vis[id] && u.step + 1 + calc_h(a) < f[id]) { f[id] = u.step + 1 + calc_h(a); g[id] = u.step + 1; pre[id] = u.id; q.push((node){nx, ny, u.step + 1, id}); } swap(a[x][y], a[nx][ny]); } } } int main() { for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { scanf("%d", &a[i][j]); } } for (int i = 0; i < 3; i++) { for (int j = 0; j < 3; j++) { scanf("%d", &b[i][j]); } } A_star(); printf("%d\n", ans); print(get_id(b)); return 0; } ```

最新推荐

recommend-type

人工智能 A*算法 八数码问题 C++ 报告+代码+详细注释

使用C++语言完整的实现了A星算法解决八数码问题 内容:完整代码和详细注释; 主要函数的功能说明; 评价函数的设计; 运行测试结果
recommend-type

A*算法解八数码问题(报告附录里有源代码),保准能运行

C++实现的A*算法解八数码问题,报告的附录里有源代码,在VC6.0的环境下开发运行的
recommend-type

node-v18.11.0-headers.tar.xz

Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
recommend-type

JavaScript_跨平台3D场景编辑器基于threejs golang和mongodb桌面和web.zip

JavaScript
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

可见光定位LED及其供电硬件具体型号,广角镜头和探测器,实验设计具体流程步骤,

1. 可见光定位LED型号:一般可使用5mm或3mm的普通白色LED,也可以选择专门用于定位的LED,例如OSRAM公司的SFH 4715AS或Vishay公司的VLMU3500-385-120。 2. 供电硬件型号:可以使用常见的直流电源供电,也可以选择专门的LED驱动器,例如Meanwell公司的ELG-75-C或ELG-150-C系列。 3. 广角镜头和探测器型号:一般可采用广角透镜和CMOS摄像头或光电二极管探测器,例如Omron公司的B5W-LA或Murata公司的IRS-B210ST01。 4. 实验设计流程步骤: 1)确定实验目的和研究对象,例如车辆或机器人的定位和导航。
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。
recommend-type

"互动学习:行动中的多样性与论文攻读经历"

多样性她- 事实上SCI NCES你的时间表ECOLEDO C Tora SC和NCESPOUR l’Ingén学习互动,互动学习以行动为中心的强化学习学会互动,互动学习,以行动为中心的强化学习计算机科学博士论文于2021年9月28日在Villeneuve d'Asq公开支持马修·瑟林评审团主席法布里斯·勒菲弗尔阿维尼翁大学教授论文指导奥利维尔·皮耶昆谷歌研究教授:智囊团论文联合主任菲利普·普雷教授,大学。里尔/CRISTAL/因里亚报告员奥利维耶·西格德索邦大学报告员卢多维奇·德诺耶教授,Facebook /索邦大学审查员越南圣迈IMT Atlantic高级讲师邀请弗洛里安·斯特鲁布博士,Deepmind对于那些及时看到自己错误的人...3谢谢你首先,我要感谢我的两位博士生导师Olivier和Philippe。奥利维尔,"站在巨人的肩膀上"这句话对你来说完全有意义了。从科学上讲,你知道在这篇论文的(许多)错误中,你是我可以依