前言:最近在慕課網看了個視屏學習廣度優先演算法,通過這個演算法來計算出走出迷宮的最短路徑,因此在此記錄來加深自己對廣度優先演算法的理解。目錄一、什麼是廣度優先演算法?廣度優先演算法能做什麼?
二、**實現
三、最終結果
廣度優先演算法(breadth-first search),同廣度優先搜尋,又稱作寬度優先搜尋,或橫向優先搜尋,簡稱bfs,是一種圖形搜尋演演算法。
我們會經常碰到這樣乙個問題,從乙個起點a開始要到乙個終點b,我們要找尋一條最短的路徑。這個時候廣度優先演算法就用上了,為此,我們可以得到2個問題。
問題一:起點a是否有路徑到達終點b?
問題二:起點a到達起點b的最短路徑是什麼?
通過上面的個問題我們來實現我在視屏裡學習的用這個演算法來走出迷宮(我也是照著視屏敲的.........)
假設下圖是乙個迷宮總共6行5列,數字1是一堵牆,數字0表示是可以走的路,那麼我們將計算出從起點a到終點b的最短距離及路線,路線我已經畫出來了,下面我直接貼實現**了。。
1.實現**
package main
import (
"fmt"
"os"
)func main() , point)
for _, row := range data
fmt.println() }}
/***作用:座標結構體
*修改:無
*/type point struct
/***作用:下乙個節點的座標
*修改:無
*/func (p point) add(r point) point
}/**
*作用:當前座標的值,驗證是否越界及路是否可走
*修改:無
*/func (p point) at(grid int) (int, bool)
//驗證y軸是否越界
if p.j < 0 || p.j >= len(grid[p.i])
return grid[p.i][p.j], true
}/**
*作用:當前座標對應的周圍座標,上下左右
*修改:無
*/var dirs = [4]point, , , ,
}/**
*作用:實現
*修改:無
*/func walk(maze int, start, end point) int
//需要走的路,起始第一步,【0,0】
q := point
//開始走
for len(q) > 0
//是否走過
val, ok = next.at(steps)
if !ok || val != 0
//回到起點
if next == start
cursteps, _ := cur.at(steps)
steps[next.i][next.j] = cursteps + 1
} }return steps
}/**
作用:讀取檔案裡的資料
*/func readmaze(filename string) int
var row, col int
fmt.fscanf(file, "%d %d", &row, &col)
maze := make(int, row)
for i := range maze
} return maze
}
2.迷宮檔案資訊
下圖即為最終結果,我們可以看出從a到b路徑和最短路徑是13步
學習**:
golang廣度優先演算法 走迷宮
廣度優先遍歷,走迷宮思路 1 建立二維陣列,0表示是路,1表示是牆 建立佇列q,儲存可遍歷的點,q的第乙個元素為起始點 2 從佇列中取乙個點,開始,按上 左 下 右的順序遍歷周圍的點next,next點在陣列的範圍內,且值為0,則把next存入佇列q中,並在steps 行走記錄二維陣列 中記錄步數,...
走迷宮 廣度優先搜尋演算法
假設有如下的迷宮 迷宮0 1000 0001 0010 1011 1000 1001 0100 0 其中0表示可走,1表示牆壁,只能按上下左右的方向走,請問從左上角走到右下角哪條路最短?這裡就以廣度優先搜尋演算法來探索走法。過程如下 下面給出php和go的示例 define maze file di...
go語言的迷宮的廣度優先搜尋
自主學習 package main import os fmt func main fmt.println fmt.println steps walk maze,point,point 列印走的路徑 for row range steps fmt.println type point struct...