深度优先和广度优先的基础应用

  图来自啊哈算法

这里描述的问题就是如何从1,1走到4,3

这里有两个解决方案,一个是用深度优先算法

  初始化地图,和标记点

        int[,] ditu = new int[5, 4]{
                {0,0,1,0},
                {0,0,0,0},
                {0,0,1,0},
                {0,1,0,0},
                {0,0,0,1}
            };
        int[,] book_1 = new int[5, 4];

  定义每次走的方向

        int[,] fanxiang = new int[4, 2] {
            {0,1},//右边
            {1,0},//下边
            {0,-1},//左边
            {-1,0}//上边
        };
        private void dyzdlj(int x, int y, int step)
        {
            if (x == 3 && y == 2)
            {
                if (step < min)
                {
                    min = step;
                }
                Console.WriteLine("我找到了一种走的方法了,一共走了{0}步", step);
                return;
            }
            for (int i = 0; i < 4; i++)
            {
                //走
                int tx = x + fanxiang[i, 0];
                int ty = y + fanxiang[i, 1];
                //判断是否越界
                if (tx < 0 || ty < 0 || tx > 4 || ty > 3)
                {
                    continue;
                }
                if (book_1[tx, ty] == 0 && ditu[tx, ty] == 0)
                {
                    book_1[tx, ty] = 1;
                    dyzdlj(tx, ty, step + 1);
                    book_1[tx, ty] = 0;
                }
            }
        }

  2.广度搜索,所谓的广度搜索呢,就是每次把能走的全部走光

  定义基本的结构,用来保存数据

    public struct node
    {
        public int x;//x坐标
        public int y;//y坐标
        public int s;//步数
    }

  具体实现

        private void gdyxsf()
        {
            node[] nn = new node[20];
            int head = 0, tail = 0;
            //设置起点
            nn[head].x = 0;
            nn[head].y = 0;
            nn[head].s = 0;
            book_1[0, 0] = 1;
            tail++;
            int flag = 0;
            while (head<tail)
            {

                for (int i = 0; i < 4; i++)
                {
                    int tx =nn[head].x+fanxiang[i, 0];
                    int ty = nn[head].y + fanxiang[i, 1];
                    if (tx<0||ty<0||tx>4||ty>3)
                    {
                        continue;
                    }
                    //判断地图是否被走过
                    if (ditu[tx,ty]==0&&book_1[tx,ty]==0)
                    {
                        book_1[tx, ty] = 1;
                        nn[tail].x = tx;
                        nn[tail].y = ty;
                        nn[tail].s = nn[head].s + 1;
                        tail++;
                    }
                    if (book_1[3,2]==1)
                    {
                        flag = 1;
                        break;
                    }
                }
                if (flag==1)
                {
                    Console.WriteLine("我已经到了这个地方了,我一共走了{0}步", nn[tail - 1].s);
                    break;
                }
                head++;
            }
        }

  执行结果

  

时间: 2024-11-29 12:03:09

深度优先和广度优先的基础应用的相关文章

存储结构与邻接矩阵,深度优先和广度优先遍历及Java实现

如果看完本篇博客任有不明白的地方,可以去看一下<大话数据结构>的7.4以及7.5,讲得比较易懂,不过是用C实现 下面内容来自segmentfault 存储结构 要存储一个图,我们知道图既有结点,又有边,对于有权图来说,每条边上还带有权值.常用的图的存储结构主要有以下二种: 邻接矩阵 邻接表 邻接矩阵 我们知道,要表示结点,我们可以用一个一维数组来表示,然而对于结点和结点之间的关系,则无法简单地用一维数组来表示了,我们可以用二维数组来表示,也就是一个矩阵形式的表示方法. 我们假设A是这个二维数组

树的深度优先与广度优先遍历

简述树的深度优先及广度优先遍历算法,并说明非递归实现. 原题出自百度的笔试: 当时我看到这个题目的时候,已经完全记不得非递归算法该怎么实现了,后来查阅了一下,要用到两个辅助的数据结构: 深度优先遍历--->栈: 广度优先遍历--->队列: 这里以二叉树为例来实现. import java.util.ArrayDeque; public class BinaryTree { static class TreeNode{ int value; TreeNode left; TreeNode rig

爬了个爬(二)性能相关 及 深度优先与广度优先

性能相关 在编写爬虫时,性能的消耗主要在IO请求中,当单进程单线程模式下请求URL时必然会引起等待,从而使得请求整体变慢. import requests def fetch_async(url): response = requests.get(url) return response url_list = ['http://www.github.com', 'http://www.bing.com'] for url in url_list: fetch_async(url) 1.同步执行

第三百三十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—深度优先与广度优先原理

第三百三十八节,Python分布式爬虫打造搜索引擎Scrapy精讲-深度优先与广度优先原理 网站树形结构 深度优先 是从左到右深度进行爬取的,以深度为准则从左到右的执行

Python爬虫从入门到放弃(十)之 关于深度优先和广度优先

网站的树结构 深度优先算法和实现 广度优先算法和实现 网站的树结构 通过伯乐在线网站为例子: 并且我们通过访问伯乐在线也是可以发现,我们从任何一个子页面其实都是可以返回到首页,所以当我们爬取页面的数据的时候就会涉及到去重的问题,我们需要将爬过的url记录下来,我们将上图进行更改 在爬虫系统中,待抓取URL队列是很重要的一部分,待抓取URL队列中的URL以什么样的顺序排队列也是一个很重要的问题,因为这涉及到先抓取哪个页面,后抓取哪个页面.而决定这些URL排列顺序的方法,叫做抓取策略.下面是常用的两

深度优先与广度优先算法

图的遍历有深度优先和广度优先算法. 深度优先遍历可描述为一个递归算法.当到达顶点v时,具体操作是: ①访问(v); ②for(与v相邻的每个顶点w) 遍历(w): //深度优先算法 template<int max_size> void Diagraph<max_size>::depth_first(void(*visit)(Vertex &)) const { bool visited[max_size]; //引入数组防止无限循环 Vertex v; for (all

数据结构之深度优先,广度优先遍历

深度优先和广度优先遍历在树和图中应用最为普遍,思想也类似,因此放到一起来总结. 二叉树的深度优先广度优先遍历: 一棵二叉树(2,(2(3,4),3(4,5))),这是一棵满二叉树,一共有7个节点,根节点2,深度为3 数据结构定义如下: class Node: def __init__(self, value=None, left = None, right = None): self.value = value self.left = left self.right = right 先根遍历 d

图的遍历方法(深度优先和广度优先算法)

图的遍历方法有两种: 1 深度优先 该算法类似于树的先根遍历: 2   广度优先 该算法类似树的层次遍历: 事例: 深度优先遍历顺序为:V1–V2–V4–V8–V5–V3–V6–V7 广度优先遍历顺序为:V1–V2–V3–V4–V5–V6–V7–V8 3   注意事项 1)一个图,它的深度优先和广度优先是不唯一的,可以有多个! 2)一般情况都是给邻接表或者邻接矩阵求深度优先和广度优先,此时,深度优先和广度优先都是唯一的了,因为当你的存储结构固定的时候,深度优先和广度优先也随之被固定了!

图论-深度优先和广度优先(均非递归)

图论-深度优先和广度优先(均非递归) 不使用递归的原因我这在这不重复.因此如何替代递归呢?请接着看: 深度优先:使用Stack(栈)替代  广度优先:使用Queue(队列)替代 C++代码献上: 1 #include <iostream> 2 #include<random> 3 #include <stack> 4 #include <queue> 5 using namespace std; 6 7 class Image 8 { 9 private: