万能的搜索之DFS

简介: 万能的搜索之DFS

1.全排列

输入一个数n,输出1-n的全排列

#include<iostream>
//DFS  求序列个数
using namespace std;
int a[10], book[10], n;
void dfs(int step)
{
  if (step == n + 1)//前面n个盒子已经拍好. 
  {
    for (int i = 1; i <= n; i++) {
      cout << a[i];
    }
    cout << endl;
  }
  for (int i = 1; i <= n; i++)  //依次判断数是否还在手里
  {
    if (book[i] == 0) {//如果在则把其放入其中
      a[step] = i;
      book[i] = 1;
      dfs(step + 1);
      book[i] = 0;//回溯,当该轮尝试完后,该盒子清空,尝试存放下一个数字.
    }
  }
  return;
}
int main()
{
  cin >> n;
  dfs(1);//从第一个开始进行排序
  return 0;
}

深度搜索的关键在于解决"当下该如何做".至于下一步该如何做则与当下该如何做是一样的.当我们在第step个数的时候,通常的方法是把每一种可能的数都去尝试一遍,当前这一步解决后再进入下一步dfs(step+1).

☆☆☆深度优先的基本模型

void dfs(int step){
  判断边界
  尝试每一种可能for(int i = 0; i < n; i++)
  {
    继续下一步  dfs(step+1);
  }
  返回  return;
}

2.DFS举例–解救小哈

问题描述

有一天,小哈一个人去玩迷宫。但是方向感不好的小哈很快就迷路了。小哼得知后便去解救无助的小哈。此时的小哼已经弄清楚了迷宫的地图,现在小哼要以最快的速度去解救小哈。那么,问题来了…

迷宫由n行m列的单元格组成(n和m都小于50),每个单元格要么是空地,要么是障碍物.你的任务是帮助小哼找到一条从迷宫的起点通往小哈所在位置的最短路径.注意障碍物是不能走的,当然小哼也不能走在迷宫之外.

20210415092000809.png

参考代码

#include<iostream>
using namespace std;
int n, m, p, q, min1 = 999999999;
int a[51][51], book[51][51];
int NEXT[4][2] = {
  {0,1},//向右
  {1,0},//向下
  {0,-1},//向左
  {-1,0} //向上
};
int tx, ty;
void dfs(int x, int y, int step) {
  if (x == p && y == q) {
    //更新最小值
    if (step < min1) {
      min1 = step;
    }
    return;
  }
  //枚举四种走法
  for (int k = 0; k <= 3; k++)
  {
    //计算下一个点的坐标
    tx = x + NEXT[k][0];
    ty = y + NEXT[k][1];
    //判断是否越界
    if (tx < 1 || tx > n || ty < 1 || ty>m) {
      continue;
    }
    //判断改点是否为障碍物或者已经在路径中
    if (a[tx][ty] == 0 && book[tx][ty] == 0) {
      book[tx][ty] = 1;
      dfs(tx, ty, step + 1);//开始尝试下一点
      book[tx][ty] = 0;//尝试结束取消这个点的标记.
    }
  }
  return;
}
int main()
{
  int i, j, startx, starty;
  cin >> n >> m;
  for (int i = 1; i <= n; i++)
  {
    for (int j = 1; j <= m; j++) {
      cin >> a[i][j];
    }
  }
  cin >> startx >> starty >> p >> q;
  book[startx][starty] = 1;//标记起点已经在路径中,防止后面重复走
  dfs(startx, starty, 0);
  cout << min1;
}
相关文章
|
6月前
|
算法 Python
深度剖析!Python中图的DFS与BFS遍历,让你的数据搜索快到飞起
【7月更文挑战第10天】在数据结构和算法中,图遍历是核心概念,Python支持DFS和BFS来探索图。DFS递归深入节点,利用栈,先访问深处;BFS使用队列,层次遍历,先访问最近节点。
158 1
|
7月前
|
算法
第4章 万能的搜索
第4章 万能的搜索
|
8月前
|
算法 前端开发 索引
前端算法-搜索插入位置
前端算法-搜索插入位置
DFS之连通性问题+搜索顺序
DFS之连通性问题+搜索顺序
58 0
|
算法 Python
基于python实现深度优先遍历搜索(DFS)
基于python实现深度优先遍历搜索(DFS)
533 0
基于python实现深度优先遍历搜索(DFS)
|
机器学习/深度学习 数据采集 算法
搜索与图论-DFS
搜索与图论-DFS
|
定位技术
万能的搜索之BFS
万能的搜索之BFS
万能的搜索之BFS
|
小程序 容器
小程序实现搜索功能续
小程序实现搜索功能续
小程序实现搜索功能续
|
Java 索引
搜索插入位置(Java实现)
搜索插入位置(Java实现)
90 0