数据结构与算法-迭代加深搜索算法

server/2024/11/17 4:58:51/

迭代加深搜索(Iterative Deepening Search,IDS)

是一种常用的搜索算法,结合了深度优先搜索的空间效率和广度优先搜索的完备性和最优性。其核心思想是重复进行深度优先搜索,但每次都增加搜索的深度限制,直到找到目标。

下面我将用一个简单的例子来演示迭代加深搜索:在一个迷宫中找到从起点到终点的路径。我们将用一个二维数组来表示迷宫,其中0表示可以通行的路,1表示障碍物。起点设为左上角(0,0),终点设为右下角。

C语言代码实现

首先定义迷宫的大小和迷宫本身,接着实现深度优先搜索函数,然后在主函数中实现迭代加深搜索。

#include <stdio.h>

#include <stdbool.h>

#define MAX 5 // 迷宫大小

int maze[MAX][MAX] = {

    {0, 1, 0, 0, 0},

    {0, 1, 0, 1, 0},

    {0, 0, 0, 1, 0},

    {0, 1, 0, 0, 0},

    {0, 0, 0, 1, 0}

};

bool visited[MAX][MAX]; // 访问标记数组

// 检查是否可以访问该点

bool isValid(int x, int y) {

    return (x >= 0 && x < MAX && y >= 0 && y < MAX && maze[x][y] == 0 && !visited[x][y]);

}

// 深度优先搜索实现

bool DFS(int x, int y, int depth, int maxDepth) {

    if (x == MAX - 1 && y == MAX - 1) return true; // 如果到达终点

    if (depth > maxDepth) return false; // 超过当前深度限制

    // 上下左右移动

    int dx[] = {-1, 1, 0, 0};

    int dy[] = {0, 0, -1, 1};

    for (int i = 0; i < 4; i++) {

        int nx = x + dx[i], ny = y + dy[i];

        if (isValid(nx, ny)) {

            visited[nx][ny] = true; // 标记为已访问

            if (DFS(nx, ny, depth + 1, maxDepth)) return true;

            visited[nx][ny] = false; // 回溯,撤销访问标记

        }

    }

    return false;

}

// 迭代加深搜索

bool IDDFS() {

    for (int maxDepth = 0; maxDepth < MAX * MAX; maxDepth++) {

        memset(visited, 0, sizeof(visited)); // 重置访问标记

        visited[0][0] = true; // 起点标记为已访问

        if (DFS(0, 0, 0, maxDepth)) return true;

    }

    return false;

}

int main() {

    if (IDDFS()) {

        printf("找到路径!\n");

    } else {

        printf("没有可用的路径。\n");

    }

    return 0;

}

```

上述代码中,迭代加深搜索由函数 `IDDFS()` 实现,该函数通过逐渐增加搜索深度限制来调用深度优先搜索函数 `DFS()`。如果找到路径,则返回真,否则继续增加深度限制。`isValid()` 函数用于检查某个位置是否可以进入。整个迷宫搜索从 (0,0) 开始,目标是到达 (MAX-1, MAX-1)。

这个例子展示了迭代加深搜索在解决限定深度的路径搜索问题中的应用。这种方法特别适合解决路径长度不确定或需要找到最短路径的问题。


http://www.ppmy.cn/server/22990.html

相关文章

VR全景创业项目应该如何开展?未来有市场吗?

伴随着5G网络的发展&#xff0c;VR全景得到了众多的关注和提升。与此同时&#xff0c;各行各业都开始关注自身产业在互联网的展示效果&#xff0c;因为年轻一代的生活已经离不开互联网&#xff0c;而VR全景在互联网上的3D展示效果能给商家带来流量&#xff0c;提升营业额。 随着…

使用Docker搭建Nacos集群

本次是在Mac的M1版本上使用Docker搭建Nacos集群的详细步骤&#xff0c;并记录了一些遇到的问题及解决方案。 搭建涉及&#xff1a;1个Nginx 3个Nacos 1个MySQL 使用版本&#xff1a;Nginx为1.22.0&#xff0c;Nacos为2.0.3&#xff0c;MySQL为8.0.30 一、创建虚拟网络 因为M…

数据结构 第六章 树与二叉树(三)

&#x1f680; 【考纲要求】二叉树的遍历 &#x1f680; 第六章第一节内容请查看此链接 树的基本概念 &#x1f680; 第六章第二节内容请查看此链接 二叉树的定义、四种特殊的二叉树和二叉树的存储结构 三、二叉树的遍历和线索二叉树 3.1二叉树的遍历 所谓的二叉树的遍历就是…

VUE3与Uniapp 二 (响应式变量ref)

<template><!-- 响应式数据变量是双项绑定 --><view>{{num}}</view><view>{{string}}</view><view>{{arry[2]}}</view><view>{{obj.name}}</view> </template><script setup>// 使用ref定义响应式数据…

三维点云处理-聚类(上)

聚类&#xff08;Cluster&#xff09;是数据处理中常用的一种分析方法&#xff0c;聚类的目标是将相似的数据对象划分到同一个簇中&#xff0c;使得同一簇内的数据对象的相似性尽可能大&#xff0c;而不同簇中的数据对象的差异性也尽可能大。  这里主要是介绍两种比较经典的聚…

ArcGIS批量寻找图层要素中的空洞

空洞指的是图层中被要素包围所形成的没有被要素覆盖的地方&#xff0c;当图层要素数量非常庞大时&#xff0c;寻找这些空洞就不能一个一个的通过目测去寻找了&#xff0c;需要通过使用工具来实现这一目标。 一、【要素转线】工具 利用【要素转线】工具可以将空洞同图层要素处于…

[ LeetCode ] 题刷刷(Python)-第66题:加一

题目描述 给定一个由 整数 组成的 非空 数组所表示的非负整数&#xff0c;在该数的基础上加一。 最高位数字存放在数组的首位&#xff0c; 数组中每个元素只存储单个数字。 你可以假设除了整数 0 之外&#xff0c;这个整数不会以零开头。 示例 示例 1&#xff1a; 输入&#xf…

AI电销机器人系统源码部署之:freeswitch安装Linux

安装 FreeSWITCH&#xff08;一个开源的电话交换系统&#xff09;通常需要一些步骤&#xff0c;以下是在 Linux 系统上安装 FreeSWITCH 的基本指南&#xff1a; 准备工作&#xff1a; 确保你有一个运行 Linux 的服务器&#xff0c;并且有 root 或者具有 sudo 权限的用户。确保服…