宽度优先八数码c++

时间: 2023-06-29 16:13:13 浏览: 58
下面是一个基于宽度优先搜索算法实现的八数码问题解决程序的 C++ 代码: ```c++ #include <iostream> #include <queue> #include <map> #include <cstring> using namespace std; // 八数码的状态结构体 struct node { int num[3][3]; // 表示八数码的矩阵 int x, y; // 空格的位置 int step; // 到达当前状态的步数 int pre; // 前驱状态的编号 } s, e, u, v; int fac[] = {1, 1, 2, 6, 24, 120, 720, 5040, 40320}; // 阶乘 int dx[] = {-1, 0, 1, 0}; // 上下左右移动 int dy[] = {0, 1, 0, -1}; int cantor(int a[]) { // 康拓展开 int sum = 0; for (int i = 0; i < 9; i++) { int t = 0; for (int j = i + 1; j < 9; j++) if (a[i] > a[j]) t++; sum += t * fac[9 - i - 1]; } return sum; } void reverse_cantor(int x, int a[]) { // 康拓展开的逆运算 int vis[10] = {0}; for (int i = 0; i < 9; i++) { int t = x / fac[9 - i - 1]; x %= fac[9 - i - 1]; for (int j = 1; j <= 9; j++) if (!vis[j]) { if (t == 0) { a[i] = j; vis[j] = 1; break; } else t--; } } } int bfs() { queue<node> q; map<int, int> mp; s.step = 0; s.pre = -1; int a[10]; for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) a[i * 3 + j] = s.num[i][j]; mp[cantor(a)] = 1; q.push(s); while (!q.empty()) { u = q.front(); q.pop(); if (memcmp(u.num, e.num, sizeof(u.num)) == 0) return u.pre; for (int i = 0; i < 4; i++) { int nx = u.x + dx[i], ny = u.y + dy[i]; if (nx >= 0 && nx < 3 && ny >= 0 && ny < 3) { memcpy(&v, &u, sizeof(u)); swap(v.num[u.x][u.y], v.num[nx][ny]); v.x = nx, v.y = ny; v.step++; int a[10]; for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) a[i * 3 + j] = v.num[i][j]; int code = cantor(a); if (!mp[code]) { mp[code] = 1; v.pre = mp.size() - 1; q.push(v); } } } } return -1; } int main() { // 输入初始状态和目标状态 for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) { cin >> s.num[i][j]; if (s.num[i][j] == 0) s.x = i, s.y = j; } for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) cin >> e.num[i][j]; int ans = bfs(); if (ans == -1) cout << "无解" << endl; else { cout << "步数为:" << u.step << endl; int path[1000], cnt = 0; while (ans != -1) { path[cnt++] = u.pre; u = q[u.pre]; } cout << "解路径为:"; for (int i = cnt - 1; i >= 0; i--) cout << " " << path[i]; cout << endl; } return 0; } ``` 其中,`cantor` 函数实现康拓展开,用于将每个状态映射到一个唯一的整数上;`reverse_cantor` 函数实现康拓展开的逆运算,用于从一个整数反推出对应的状态;`bfs` 函数实现基于宽度优先搜索算法的八数码问题的解决。程序的输入为两个 $3\times3$ 的矩阵,分别表示初始状态和目标状态,输出为最少需要多少步才能从初始状态到达目标状态,以及从初始状态到达目标状态的解路径。

相关推荐

最新推荐

recommend-type

C++面试八股文深度总结

根据自己备战22届秋招(斩获华为、荣耀、联发科、海康威视等offer)总结的相关知识,其中包括C++基础知识、操作系统、计算机网络、数据库等知识。希望对读者有帮助,助其在找工作的路上少走弯路,收获自己心仪的...
recommend-type

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

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

c++入门,核心,提高讲义笔记

最详细的c++入门,核心,提高讲义笔记,看会成为大佬没问题,下载后有疑问请私信。
recommend-type

八皇后问题课程设计C++版

八皇后问题等于要求八个皇后中的任意两个不能被放在同一行或同一列或同一斜线上。做这个课题,重要的就是先搞清楚哪个位置是合法的放皇后的位置,哪个不能,要先判断,后放置。我的程序进入时会让使用者选择程序的...
recommend-type

编译原理课程设计:算符优先分析 C++

编译原理课程设计:算符优先分析 C++编译原理课程设计:算符优先分析 C++编译原理课程设计:算符优先分析 C++编译原理课程设计:算符优先分析 C++
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

解释minorization-maximization (MM) algorithm,并给出matlab代码编写的例子

Minorization-maximization (MM) algorithm是一种常用的优化算法,用于求解非凸问题或含有约束的优化问题。该算法的基本思想是通过构造一个凸下界函数来逼近原问题,然后通过求解凸下界函数的最优解来逼近原问题的最优解。具体步骤如下: 1. 初始化参数 $\theta_0$,设 $k=0$; 2. 构造一个凸下界函数 $Q(\theta|\theta_k)$,使其满足 $Q(\theta_k|\theta_k)=f(\theta_k)$; 3. 求解 $Q(\theta|\theta_k)$ 的最优值 $\theta_{k+1}=\arg\min_\theta Q(
recommend-type

JSBSim Reference Manual

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