8数码问题-深搜-广搜

本文介绍了8数码问题在深度优先搜索(DFS)和广度优先搜索(BFS)中的应用。尽管BFS通常能找到最优解,但DFS可能会在指定深度内找到解但非最优解。在无法确定问题解深度的情况下,DFS可能出现三种情况:找到最优解、未找到解或找到非最优解。对于DFS未找到解的问题,没有直接解决方案,但可以通过试凑法调整递归深度。文中还提供了一个非递归DFS算法,并详细解释了如何计算hash值以确保唯一性。
摘要由CSDN通过智能技术生成

8数码问题的广搜在网上可以找到代码,广搜一般可以找到最优解,但是深搜不一定能找到最优解。一般的深搜多是指定最大递归深度的深搜,一般情况下,问题解的深度很难确定。因此深搜会出现三种情况,一是找到最优解,二是在迭代深度内找不到解,三是找到解但不是最优解。第一种情况自然是最好的,不过较经常出现的是第三种,在指定迭代深度不适当的时候也会出现第二种情况。

在迭代深度内找不到解是最糟糕的一种情况,对这个问题没有什么好的解决办法。有时候我们可以用试凑法,多次测试来找到一个比较好的递归深度。对同一输入在不同迭代深度范围内的比较如下:

输入数据

6 2 8
0 1 4
7 3 5

对于上面的测试数据,广搜的搜索深度为17,是最优的结果。下面的表格中列出了深搜的搜索深度,可以看到深搜的搜索深度不是固定的。

最大深度 17 20 30 100
求得解时深度 17 19 29 97

在下面给出的8数码问题的深度求解算法中,采用非递归的深度优先搜索,并且给出了一个较合理的递归深度。对于代码中的hash值得求取,可能有好些朋友看不大懂,这里我简单讲解一些为什么这样计算hash值。

我们设 hash = a * 8! + b * 7! + c * 6! + d * 5! + e * 4! + f  * 3! + g * 2! + h * 1! + i * 0! , 其中 a - i 分别是 0 - 8 的逆序数。到了这里,知道逆序数的朋友可以一下子就明白了。我们可以很容易的证明 a <= 8 , b < 8 , c < 7 ...... b < 8 则一定有 b * 7! < 8! 我们可以得到,如果 hash > 8! ( 即 (hash / 8! ) != 0 ) 则一定有 a != 0 ,且 hash / 8! = a,依次类推,我们可以证明 (hash % 8! ) / 7! = b ......这就是一个映射的过程,这个映射可以保证对于一组(a , b , c , d , e , f , g , h , i )一定有唯一的 hash 并且对于 一个 hash 一定有唯一的一组( a , b , c , d , e , f , h , i )相对应。 


【EDigital.h】

#pragma once

#include <queue>

using std::queue;

#define HashTableSize 362881
#define DigitalSize 9
#define MaxDeepth 30  //深度优先搜索的最大搜索深度,对有些数据,其最优解可能超过30深度,这时候深搜,程序将不会给出正确结果
 
class EDigital
{
public:
	typedef struct
	{
		int a[DigitalSize];
	}Detail;

private:
	typedef struct maps 
	{
		char detail[DigitalSize];
		int index;        // 记录自己节点在hash表中的位置
		char position;        // 记录 空格(0)在序列中的位置
	}Map,
在提供的AC代码中,有关于图的深度优先索(DFS)和广度优先索(BFS)的实现方法。 在第一段代码中,是一个关于深度优先索的实现。该代码通过递归的方式来实现深度优先索。它使用了一个路径数组和一个标记数组来记录路径和访问状态。在每一次递归时,根据条件进行索,并在索完成后进行回溯操作。最终输出所有路径的结果。 在第二段代码中,是一个关于图的广度优先索的实现。该代码使用了一个队列来进行广度优先索。它使用了一个二维数组来表示图的状态和一个二维数组来记录访问状态。在索时,将起始点入队并标记为已访问,然后通过循环遍历队列中的元素,并根据条件进行索,并将符合条件的点入队并标记为已访问。最终返回从入口到出口的路径长度。 因此,根据提供的AC代码,可以实现图的深度优先索和广度优先索算法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [【C++】数据结构之深搜+广 经典题型](https://blog.csdn.net/weixin_64967734/article/details/124994451)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值