万能的搜索之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;
}
相关文章
|
算法 C++
C++学习笔记(十五)——vector练习题
C++学习笔记(十五)——vector练习题
C++学习笔记(十五)——vector练习题
|
机器学习/深度学习 人工智能 定位技术
洛谷P1746-离开中山路(BFS)
洛谷P1746-离开中山路(BFS)
洛谷P1746-离开中山路(BFS)
|
2天前
|
云安全 监控 安全
|
7天前
|
机器学习/深度学习 人工智能 自然语言处理
Z-Image:冲击体验上限的下一代图像生成模型
通义实验室推出全新文生图模型Z-Image,以6B参数实现“快、稳、轻、准”突破。Turbo版本仅需8步亚秒级生成,支持16GB显存设备,中英双语理解与文字渲染尤为出色,真实感和美学表现媲美国际顶尖模型,被誉为“最值得关注的开源生图模型之一”。
964 5
|
13天前
|
人工智能 Java API
Java 正式进入 Agentic AI 时代:Spring AI Alibaba 1.1 发布背后的技术演进
Spring AI Alibaba 1.1 正式发布,提供极简方式构建企业级AI智能体。基于ReactAgent核心,支持多智能体协作、上下文工程与生产级管控,助力开发者快速打造可靠、可扩展的智能应用。
1101 41
|
9天前
|
机器学习/深度学习 人工智能 数据可视化
1秒生图!6B参数如何“以小博大”生成超真实图像?
Z-Image是6B参数开源图像生成模型,仅需16GB显存即可生成媲美百亿级模型的超真实图像,支持中英双语文本渲染与智能编辑,登顶Hugging Face趋势榜,首日下载破50万。
673 39
|
13天前
|
人工智能 前端开发 算法
大厂CIO独家分享:AI如何重塑开发者未来十年
在 AI 时代,若你还在紧盯代码量、执着于全栈工程师的招聘,或者仅凭技术贡献率来评判价值,执着于业务提效的比例而忽略产研价值,你很可能已经被所谓的“常识”困住了脚步。
776 69
大厂CIO独家分享:AI如何重塑开发者未来十年
|
9天前
|
存储 自然语言处理 测试技术
一行代码,让 Elasticsearch 集群瞬间雪崩——5000W 数据压测下的性能避坑全攻略
本文深入剖析 Elasticsearch 中模糊查询的三大陷阱及性能优化方案。通过5000 万级数据量下做了高压测试,用真实数据复刻事故现场,助力开发者规避“查询雪崩”,为您的业务保驾护航。
479 30
|
16天前
|
数据采集 人工智能 自然语言处理
Meta SAM3开源:让图像分割,听懂你的话
Meta发布并开源SAM 3,首个支持文本或视觉提示的统一图像视频分割模型,可精准分割“红色条纹伞”等开放词汇概念,覆盖400万独特概念,性能达人类水平75%–80%,推动视觉分割新突破。
944 59
Meta SAM3开源:让图像分割,听懂你的话