校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > 詳解Go語言運用廣度優(yōu)先搜索走迷宮

詳解Go語言運用廣度優(yōu)先搜索走迷宮

熱門標簽:阿克蘇地圖標注 excel地圖標注分布數(shù)據(jù) 壽光微信地圖標注 電話機器人軟件免費 評價高的400電話辦理 百度地圖標注后傳給手機 外呼系統(tǒng)用什么卡 外呼系統(tǒng)顯本地手機號 涿州代理外呼系統(tǒng)

一、理解廣度優(yōu)先算法

我們要實現(xiàn)的是廣度優(yōu)先算法走迷宮

比如,我們有一個下面這樣的迷宮

這個迷宮是6行5列

其中0代表可以走的路, 1代表一堵墻. 我們把墻標上言責, 就如右圖所示. 其中(0,0)是起點, (6, 5)是終點.

我們要做的是, 從起點走到終點最近的路徑.

這個例子是拋轉(zhuǎn)隱喻, 介紹廣度優(yōu)先算法, 廣度優(yōu)先算法的應(yīng)用很廣泛, 所以, 先來看看規(guī)律

1.1、分析如何進行廣度優(yōu)先探索

第一步, 我們先明確起點. 這個起點有上下左右四個方向可以探索. 我們按照順時針順序探索, 上 左 下 右

第二步: 起始位置向外探索, 有4個方向.

如上圖紅色標出的位置. 也就是起始位置可以向外探索的路徑有4個. 上 左 下 右

我們再來繼續(xù)探索.

第三步: 再次明確探索方向是 上 左 下 右

第四步: 探索上方的紅1, 上方的紅1可以向外探索的路徑有3個

第五步: 探索左側(cè)紅1, 左側(cè)紅1 有兩條路徑向外探索,

為什么是兩個呢? 本來是有3個, 但上面的路徑已經(jīng)被上面的紅1探索過了, 所以, 不重復(fù)探索的原則, 左側(cè)紅1 向外擴展的路徑有2條

第六步: 下面的紅1 向外探索的路徑有2條

第七步: 右側(cè)的紅1向外探索的路徑, 如上圖可見, 只剩下1條了

第二輪探索, 得到的探索結(jié)果是:

經(jīng)過第二輪探索, 一共探索出了8條路徑, 也就是8個黑2

接下來進行第三輪探索. 順序依然是順時針方向,

1. 第一個2向外探索的路徑有3條

2. 第二個黑2向外探索的路徑只有1條

3. 第三個黑2向外探索的路徑有2條

4. 第四個黑2向外探索的路徑有1條

5. 第五個黑2 向外探索的路徑有兩條

6. 第六個黑2向外探索的路徑有1條

7. 第七個黑2向外探索的路徑有兩條

8. 第8個黑2向外探索的路徑為0條. 已經(jīng)沒有路徑. 所以不再向外探索

通過第三輪向外探索, 我們探索出來了12條路徑.

這是有的節(jié)點可以向外探索3條路徑,有的可以向外探索2條路徑, 有的向外探索1條路徑, 有的沒有路徑可以向外探索了.

總結(jié):

通過上面的例子, 我們可以看到每個節(jié)點的3中狀態(tài). 我們來分析一下, 有哪三種狀態(tài).

剛開始, 只有一個其實位置0. 這個0是已知的, 還沒有開始向外探索. 外面還有好多等待探索的節(jié)點.所以,此時的0, 是已經(jīng)發(fā)現(xiàn)還未探索的節(jié)點

當0開始向外探索, 探索到4個1, 這時候0就變成了已經(jīng)發(fā)現(xiàn)且已經(jīng)探索的節(jié)點. 二1變成了一經(jīng)發(fā)現(xiàn)還未探索的節(jié)點. 其實此時外面還有3, 4, 5 這些還未被發(fā)現(xiàn)未被探索的節(jié)點.

我們通過分析, 廣度優(yōu)先算法還有一個特點, 那就是循環(huán)遍歷, 第一輪的紅1都探索完了, 在進行黑2的探索, 不會說紅1探索出來一個, 還沒有全部完成,就繼續(xù)向外探索.

總結(jié)規(guī)律如下:

1. 節(jié)點有三種狀態(tài)

  • a. 已經(jīng)發(fā)現(xiàn)還未探索的節(jié)點
  • b. 已經(jīng)發(fā)現(xiàn)并且已經(jīng)探索的節(jié)點
  • c. 還未發(fā)現(xiàn)且未探索的節(jié)點

2. 階段探索的順序

按照每一輪全部探索完,在探索下一輪, 這樣就形成了一個隊列, 我們把已經(jīng)發(fā)現(xiàn)還未探索的節(jié)點放到隊列里

接下來我們開始探索了.

首先, 我們知道迷宮的起始位置, (0,0)點. 當前我們站在起始位置(0,0), 那么這個起點就是已經(jīng)發(fā)現(xiàn)還未探索的節(jié)點.

我們定義一個隊列來存放已經(jīng)發(fā)現(xiàn)但還未探索的節(jié)點

第二步: 從隊列中取出節(jié)點(0,0), 開始下一步探索.我們看看迷宮最終的樣子

我們看到(0,0)只能向下走, 他的右邊是一堵墻, 走不了. 上面,左面也不能走. 所以, 探索出來的路徑只有一個(1,0), 吧(1,0)放入到隊列中

第三步: 我們在從隊列中把(1,0)取出來進行探索, 這時隊列就空了.

對照迷宮, (1,0)可以向下走, 可以向右走. 不能向上和向左. 因此, (1,0)探索出來兩條路, (2,0) 和(1,1), 把這兩個點放入到隊列中

第四步: 接下來我們來探索(2,0)這個點, 對照迷宮, 我沒發(fā)現(xiàn)(2,0)這個點下和右都是墻, 左不能走, 上就走回去了也不可以. 所以, (2,0)是個死路, 探索出來的路徑是0

第五步: 繼續(xù)探索(1,1), 對照迷宮, (1,1)只能向右探索到(1,2) , 因此我們把(1,2)放入隊列中

第六步:對(1,2)繼續(xù)探索, 發(fā)現(xiàn)有兩條路徑可以走(2,2)和(0,2), 然后, 將這兩個點放到隊列中

第七步: 接下來繼續(xù)這樣探索下去, 一直走一直走, 走到最后就是這樣的

那我們要怎么來判斷路徑呢? 倒過來走, 從13開始, 上一個數(shù)12, 只有一個, 12上面只有一個數(shù)是11, 只有一個, 一次類推, 一直找到1, 找到0.

第八步: 廣度優(yōu)先算法, 什么時候結(jié)束呢? 兩種情況

  • 第一種: 走到最后13的位置
  • 第二種: 死路, 走到一個位置, 不能再走了. 如何判斷呢?隊列中沒有可探索的點了, 探索結(jié)束

1.2、我們來總結(jié)一下

1. 從(0,0)點開始, 將已經(jīng)發(fā)現(xiàn)還未探索的點, 放入到隊列中.

2. 從隊列中取出已經(jīng)發(fā)現(xiàn)還未探索的節(jié)點, 進行探索, 探索的方式是, 像四周探索, 然后把新發(fā)現(xiàn)還未探索的節(jié)點從隊列中取出來.

3. 如何判斷呢? 如果當前是一堵墻, 也就是他的value=0, 那么探索失敗. 向左探索的時候, 如果左邊是(0,*)探索失敗. 向上探索的時候, 如果上面是(*,0)探索失敗; 像右面探索的時候, 碰到邊(*,4)探索失敗. 向下探索, 碰到(5,*)探索失敗. 也就是, 橫向坐標的范圍是 0=x=4, 縱坐標是 0=y=5

4. 已經(jīng)探索過的節(jié)點不要重復(fù)探索

1.3、代碼分析

1. 隊列可以用一個數(shù)組來實現(xiàn). 先進先出

2. 點用二維數(shù)據(jù)來表示. 但是go中的二維數(shù)組的含義是一位數(shù)組里的值又是一個數(shù)組.比如[][]int, 他是一個一維數(shù)組[]int, 里面的值又是一個一維數(shù)組.[]int.

那么用在這里就是, 縱坐標表示有6行, 那么他是一個[6]int, 橫坐標表示每行里面又是一個數(shù)組, 每行有6個元素[5]int, 所以, 這就是一個[6][5]int 有6行5列的數(shù)組.

二、代碼實現(xiàn)廣度優(yōu)先算法走迷宮

第一步: step代表從start開始, 走了多少步走到目標點, 最后的路徑是通過這個創(chuàng)建出來的, 最后從后往前推就可以算出最短路徑

第二步: 定義一個隊列, 用來保存已經(jīng)發(fā)現(xiàn)還未探索的點, 隊列里的初始值是(0,0)點

第三步: 開始走迷宮, 走迷宮退出的條件有兩個

     1. 走到終點, 退出

     2. 隊列中沒有元素, 退出

第四步:  判斷坐標是否符合探索的要求

         1. maze at next is 0

         2. and setp at next is 0, 如果step的值不是0 ,說明曾經(jīng)到過這個點了, 不能重復(fù)走

         3. next != start 處理特殊點, (0,0)點

第五步: 已經(jīng)找到這個點了, 計算當前的步數(shù), 并加入隊列中

package main

import (
    "fmt"
    "os"
)

func readFile(filename string) [][]int{
    // 定義一個行和列,用來接收迷宮是幾行幾列的數(shù)組
    var row, col int
    file, e := os.Open(filename)
    if e != nil {
        panic("error")
    }
    defer file.Close()

    fmt.Fscan(file, row, col)

    // 定義一個數(shù)組
    // 注意: 定義數(shù)組的時候, 我們只要傳入幾行就可以了.
    // 二維數(shù)組的含義, 其實質(zhì)是一個一維數(shù)組, 一維數(shù)組里每一個元素又是一個數(shù)組
    maze := make([][]int, row)
    for i := 0; i  len(maze); i++ {
        maze[i] = make([]int, col)
        for j := 0; j  len(maze[i]); j++ {
            fmt.Fscan(file, maze[i][j])
        }
    }

    return maze
}

type point struct {
    i, j int
}

// 當前節(jié)點, 向四個方向探索后的節(jié)點
// 這里使用的是返回新的節(jié)點的方式, 不修改原來的節(jié)點. 所以使用的是值拷貝,而不是傳地址
func (p point) add(dir point) point{
    return point{p.i + dir.i, p.j + dir.j }
}

// 獲取某個點的坐標值
// 同時判斷這個點有沒有越界, 返回的是這個值是否有效
// return 第一個參數(shù)表示返回的值是否是1, 是1表示撞墻了
//        第二個參數(shù)表示返回的值是否不越界, 不越界返回true, 越界,返回false 就和你
func (p point) at(grid [][]int) (int, bool) {
    if p.i  0 || p.i >= len(grid) {
        return 0, false
    }

    if p.j 0 || p.j >= len(grid[0]) {
        return 0, false
    }
    return grid[p.i][p.j], true
}

// 定義要探索的方向, 上下左右四個方向
var dirs = []point {
    point{-1, 0},
    point{0, -1},
    point{1, 0},
    point{0, 1},
}

// 走迷宮
func walk(maze [][]int, start, end point) [][]int {
    // 第一步: step代表從start開始, 走了多少步走到目標點, 最后的路徑是通過這個創(chuàng)建出來的, 最后從后往前推就可以算出最短路徑
    // 2. 通step還可以知道哪些點是到過的, 哪些點是沒到過的
    step := make([][]int, len(maze))
    for i := range step {
        // 定義每一行有多少列, 這樣就定義了一個和迷宮一樣的二維數(shù)組
        step[i] = make([]int, len(maze[i]))
    }

    // 第二步: 定義一個隊列, 用來保存已經(jīng)發(fā)現(xiàn)還未探索的點, 隊列里的初始值是(0,0)點
    Que := []point{start}

    // 第三步: 開始走迷宮, 走迷宮退出的條件有兩個
    // 1. 走到終點, 退出
    // 2. 隊列中沒有元素, 退出
    for len(Que) > 0 {
        // 開始探索, 依次取出隊列中, 已經(jīng)發(fā)現(xiàn)還未探索的元素
        // cur 表示當前要探索的節(jié)點
        cur := Que[0]
        // 然后從頭拿掉第一個元素
        Que = Que[1:]

        // 如果這個點是終點, 就不向下探索了
        if cur == end {
            break
        }

        // 當前節(jié)點怎么探索呢? 要往上下左右四個方向去探索
        for _, dir := range dirs {
            // 探索下一個節(jié)點, 這里獲取下一個節(jié)點的坐標. 當前節(jié)點+方向
            next := cur.add(dir)
            // 判斷坐標是否符合探索的要求
            // 1. maze at next is 0
            // 2. and setp at next is 0, 如果step的值不是0 ,說明曾經(jīng)到過這個點了, 不能重復(fù)走
            // 3. next != start 處理特殊點, (0,0)點

            // 探索這個點是否是墻
            val, ok := next.at(maze)
            if !ok || val == 1 {
                continue
            }

            // 探索這個點是否已經(jīng)走過
            val, ok = next.at(step)
            if val != 0 || !ok {
                continue
            }

            // 走到起始點了, 返回
            if next == start {
                continue
            }

            // 已經(jīng)找到這個點了, 計算當前的步數(shù)
            curval, _ := cur.at(step) // 當前這一步的步數(shù)
            step[next.i][next.j] = curval + 1 // 下一步是當前步數(shù)+1
            Que = append(Que, next) // 將下一步節(jié)點放入到隊列中
        }

    }
    return step
}

func main() {

    maze := readFile("maze/maze.in")

    steps := walk(maze, point{0, 0}, point{len(maze) - 1, len(maze[0]) - 1})
    // len(maze)-1, len[maze[0]]-1 是終點
    // 0,0是起始點
    for _, row := range steps {
        for _, val := range row  {
            fmt.Printf("%3d", val)
        }
        fmt.Println()
    }
}

以上就是詳解Go語言運用廣度優(yōu)先搜索走迷宮的詳細內(nèi)容,更多關(guān)于Go 廣度優(yōu)先搜索走迷宮的資料請關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:
  • Go語言實現(xiàn)的樹形結(jié)構(gòu)數(shù)據(jù)比較算法實例
  • Go語言算法之尋找數(shù)組第二大元素的方法
  • Golang算法問題之數(shù)組按指定規(guī)則排序的方法分析
  • Golang排列組合算法問題之全排列實現(xiàn)方法

標簽:蘭州 重慶 汕頭 吐魯番 銅川 梅河口 欽州 雞西

巨人網(wǎng)絡(luò)通訊聲明:本文標題《詳解Go語言運用廣度優(yōu)先搜索走迷宮》,本文關(guān)鍵詞  詳解,語言,運用,廣度,優(yōu)先,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《詳解Go語言運用廣度優(yōu)先搜索走迷宮》相關(guān)的同類信息!
  • 本頁收集關(guān)于詳解Go語言運用廣度優(yōu)先搜索走迷宮的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    成人在线视频一区| 丰满亚洲少妇av| 欧美日韩高清一区二区不卡| 人妖欧美一区二区| 久久久久国色av免费看影院| 在线视频欧美精品| 免费高清在线视频一区·| 亚洲成人动漫精品| 国产精品久久福利| 日韩视频123| 色欧美片视频在线观看在线视频| 美女性感视频久久| 亚洲精品日日夜夜| 久久久国产综合精品女国产盗摄| 国产亚洲一区二区在线观看| 91.xcao| 91视频观看免费| 国产福利一区二区三区| 日韩高清在线一区| 亚洲综合丁香婷婷六月香| 久久久综合九色合综国产精品| 久久精品欧美日韩精品 | 91精品午夜视频| 日韩一区二区在线观看视频播放| 日韩美女主播在线视频一区二区三区| 91毛片在线观看| 欧美精品粉嫩高潮一区二区| 91丨porny丨户外露出| 在线观看一区二区精品视频| 91精品国产综合久久久久久| 久久久精品黄色| 亚洲综合网站在线观看| 久久av中文字幕片| 久久99精品久久久久久国产越南 | 国产综合一区二区| 精品一区二区三区免费| av一本久道久久综合久久鬼色| 国产精品综合av一区二区国产馆| 精品亚洲国产成人av制服丝袜 | 亚洲欧美日本在线| 亚洲欧洲av一区二区三区久久| 亚洲国产精品二十页| 中文字幕精品综合| 日韩精品欧美精品| 国产一区二区三区电影在线观看| 麻豆中文一区二区| 一本大道久久a久久精二百| 欧美电影免费提供在线观看| 亚洲欧美日韩国产手机在线| 国产在线国偷精品免费看| 欧美视频一二三区| 欧美不卡一区二区三区四区| 久久久国际精品| 日韩黄色片在线观看| 99re热这里只有精品视频| 日本久久精品电影| 91精品国产综合久久久蜜臀图片| 国产精品福利影院| 国产精品18久久久久久vr| 欧美日韩国产123区| 一区二区在线观看免费| 成人av在线网| 4hu四虎永久在线影院成人| 亚洲色欲色欲www| 日韩和欧美一区二区三区| 在线观看免费亚洲| 亚洲人123区| 99视频超级精品| 国产精品国产三级国产aⅴ原创| 精品影院一区二区久久久| 欧美一区二区久久久| 中文字幕一区视频| |精品福利一区二区三区| 国产精品一卡二| 久久久蜜桃精品| 国产一区二区三区av电影| 日韩福利视频网| 欧美色手机在线观看| 在线成人av网站| 樱花草国产18久久久久| 91久久奴性调教| 亚洲黄色尤物视频| 欧美无砖专区一中文字| 日日摸夜夜添夜夜添精品视频| 欧美日韩一级二级| 美女视频黄 久久| 亚洲精品一区二区三区蜜桃下载| 亚洲男人的天堂在线观看| 91高清视频免费看| 亚洲福利一二三区| 91理论电影在线观看| 亚洲丝袜制服诱惑| 欧美日本在线视频| 国产在线一区观看| 国产精品天美传媒沈樵| 韩国视频一区二区| 国产精品三级电影| 欧美探花视频资源| aaa国产一区| 亚洲同性gay激情无套| 色婷婷久久久综合中文字幕 | 欧美久久久影院| 蜜桃在线一区二区三区| 国产夜色精品一区二区av| 成人午夜av电影| 亚洲国产一二三| 久久久综合激的五月天| 91精彩视频在线| 国产一区亚洲一区| 亚洲视频综合在线| 日韩精品中文字幕一区二区三区 | 欧美一级日韩一级| 中文字幕人成不卡一区| 久久久亚洲国产美女国产盗摄| 狠狠色狠狠色综合系列| 中文字幕日韩欧美一区二区三区| 色菇凉天天综合网| 精品在线观看视频| 亚洲综合无码一区二区| 久久精品日韩一区二区三区| 91精品办公室少妇高潮对白| 国产在线不卡一区| 日韩电影在线观看网站| 亚洲色大成网站www久久九九| 精品剧情v国产在线观看在线| 色综合久久九月婷婷色综合| 国产黄色成人av| 蜜桃久久av一区| 香蕉久久夜色精品国产使用方法| 国产精品色眯眯| 久久久99精品久久| 日韩精品最新网址| 91精品国产日韩91久久久久久| 国产福利一区二区| 亚洲综合区在线| 国产日韩精品一区| 亚洲不卡在线观看| 国产精品人人做人人爽人人添| 日韩丝袜情趣美女图片| 欧美日韩精品一区视频| 色综合天天天天做夜夜夜夜做| 亚洲欧洲成人自拍| 久久精品一区二区三区不卡| 日韩精品一区二区三区swag | www.激情成人| 国产成人亚洲综合a∨婷婷图片| 久久精品久久综合| 另类中文字幕网| 另类小说综合欧美亚洲| 欧美aⅴ一区二区三区视频| 亚洲成av人影院在线观看网| 亚洲国产一二三| 五月激情综合婷婷| 中文字幕日韩一区| 91精品在线免费观看| 欧美午夜精品久久久久久孕妇| www.视频一区| 成人白浆超碰人人人人| 懂色一区二区三区免费观看| 懂色av噜噜一区二区三区av| 国产91丝袜在线观看| 国产夫妻精品视频| 国产高清亚洲一区| 国产99久久久久| 91免费在线看| 欧美日韩性生活| 欧美成人三级电影在线| 国产日韩欧美综合在线| 亚洲欧美日韩电影| 日日夜夜免费精品视频| 老司机免费视频一区二区| 国产九九视频一区二区三区| 成人免费看视频| 色哟哟日韩精品| 欧美一区二区三区免费大片| 欧美精品一区二区三区四区| 国产精品灌醉下药二区| 亚洲精品国产一区二区精华液 | 亚洲第一在线综合网站| 日韩电影免费在线观看网站| 精彩视频一区二区| 91视频91自| 日韩一区二区三区在线视频| 欧美国产激情二区三区 | 国产亚洲精品福利| 亚洲特黄一级片| 男人的j进女人的j一区| 国产91丝袜在线播放| 欧美日韩精品欧美日韩精品 | 99国产麻豆精品| 91麻豆精品国产91久久久久| www国产成人免费观看视频 深夜成人网| 91在线porny国产在线看| 欧美性大战xxxxx久久久| 欧美精品一区二区三区蜜桃| 亚洲人妖av一区二区| 日本美女视频一区二区| 成人国产精品免费网站| 欧美精品免费视频| 亚洲人快播电影网|