重排九宫——C++实现BFS DFS搜索

重排九宫——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输出:
BFS结果
DFS输出

样例二

输入:
在这里插入图片描述
输出:
在这里插入图片描述

完整代码

// 重排九宫问题.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
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值