重排九宫——C++实现BFS DFS搜索
参考链接:暴力美学之广度搜索求解重排九宫格问题.
这里写目录标题
你好! 这是我第一次使用 Markdown编辑器 所展示的欢迎页。重排九宫问题,是人工智能领域涉及搜索策略的经典问题,即在3X3的正方形方格中排列八个元素,利用空位将其一步步移动从而寻找最优解路径的过程,其中最为常见解决这个问题的算法是广度优先算法,其优点是具有完备性。而且总是能找到最优解,缺点是面对过于复杂的情况,计算量较大,受制于计算资源。我的工作主要是在godgreen暴力美学的基础上进一步优化架构,并实现深度优先算法对九宫格实现重排。DFS的思想是从一个顶点V0开始,沿着一条路一直走到底,如果发现不能到达目标解,那就返回到上一个节点,然后从另一条路开始走到底。
关键代码段
1、OPEN表
(1)OPEN表节点放入CLOSE表
//与广度优先不同的关键点1
for (int i = 0; i <= 2; i++) {
for (int j = 0; j <= 2; j++)
close[closenumber].jiugongge[i][j] = open[opennumber].jiugongge[i][j];
}
close[closenumber].deepnumber = open[opennumber].deepnumber;
close[closenumber].father = open[opennumber].father;
BFS从OPEN表头开始,DFS从OPEN表尾(刚刚放入的节点开始)
(2)OPEN表节点的删除
//与广度优先不同的关键点2
open[opennumber] = open[opennumber + 1];
opennumber--;
2、CLOSE表
路径展示
printf_s(" 第%d次:\r\n",closenumber+1);
show(close[closenumber].jiugongge);
CLOSE表的队列顺序实际就是搜索顺序
3、成果展示
样例一
P145例题——机械工程出版社的《人工智能导论》
输入:
初始的位置为:
2 8 3
1 0 4
7 6 5
终止的位置为:
2 8 3
1 6 0
7 5 4
BFS输出:
样例二
输入:
输出:
完整代码
// 重排九宫问题.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
#include <iostream>
#include <string>
#include<time.h>
using namespace std;
//定义广度搜索深度为8
int deepnum = 50;
//close表中的标记
int closenumber = 0;
//定义九宫格结构体
struct Jiugong {
//搜索深度
int deepnumber;
//九宫格字符组
char jiugongge[3][3] ;
struct Jiugong* father;
};
struct Jiugong open[1000000];
struct Jiugong close[1000000];
//定义两个数组储存初始和终止九宫格状态
char start[3][3];
char final[3][3];
//定义九宫格初始状态函数
int opennumber;
//显示是否可以拓展
bool flag;
//检查是否到达结束状态
bool checked(char str[3][3], char str2[3][3]) {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (str[i][j] != str2[i][j]) {
return false;
}
}
}
return true;
}
//判断九宫格是否已经存在
bool alreadyexit(struct Jiugong a, struct Jiugong b) {
if (checked(a.jiugongge, b.jiugongge)) {
return true;
}
else return false;
}
//寻找0所在位置
int findzero(char s[3][3]) {
for (int i = 0; i <= 2; i++) {
for (int j = 0; j <= 2; j++) {
if (s[i][j] == '0')
return i * 3 + j;
}
}
}
//打印九宫格
void show(char square[3][3]) {
int i, j;
for (i = 0; i <= 2; i++) {
for (j = 0; j <= 2; j++) {
printf_s(" %c ", square[i][j]);
}
printf_s("\r\n");
}
}//展示需要完成移动的路径
void