迷宫问题与深搜和广搜
前言
搜索算法是一种较为常见且基础的算法
最新在做迷宫问题的时候学习了深度优先搜索和广度优先搜索
写一个博客来总结一下 也方便以后自己复习
提示:以下是本篇文章正文内容,下面案例可供参考
一、深度优先算法
1)简介
深度优先算法(Depth-First-Search),可以简称为DFS,是从一个点出发,通过函数的递归调用,不断地寻找下一个点。如果拓展出来的这个点已经找到了我们所需要的解,那么就开始递归返回到上一个点,如果上一个点不能再继续拓展出新的点,那么就需要递归返回到其父亲节点。不断地判断下去,最终可以得到我们的最优解。
2)实例---->迷宫问题
Description:
小明迷路了,你可以帮他回家吗
Input:
第一行,输入m,n,表示该迷宫有m行n列(m<=85,n<=85)
之后输入一个m*n的矩阵
’S‘ 表示 起点
‘E’ 表示终点
output:
输出从起点走到终点需要的最短步数min
如果没有找到任何一个可行解,打印Sad
思路: 从起始点开始扩展可能的点,每拓展出来一个点,在标记数组Book中将其置真值表示已经走过,在递归返回的时候不要忘记将这个点置假,因为其他的点可能会拓展到这个点上来。
代码
#include <iostream>
#define N 90
using namespace std;
char map[N+1][N+1];
int book[N+1][N+1]; //标记地图中每个点的状态
int final_x,final_y;
int _min=99999999; //记录最后的最小步数
int m=0,n=0;
int next[5][2]={
{
0,0},{
0,1},{
1,0},{
0,-1},{
-1,0}};//方向数组
void dfs(int x,int y,int sum){
//如果已经到达回家的路
int xr,yr;
if(x == final_x && y == final_y){
if(sum < _min) _min = sum;//如果这条路线的
//最小步数小于当前记录的最小步数
//就更新
return;
}
for(int i = 1;i<=4;i++){
xr