1. 程式人生 > >C# BFS DFS 迷宮尋徑 深度優先演算法 廣度優先演算法

C# BFS DFS 迷宮尋徑 深度優先演算法 廣度優先演算法

dfs 深度優先
(1) 訪問一個鄰接的未訪問頂點,標記它,並把它放入棧中。
(2) 當不能執行規則1時,如果棧不空,就從棧中彈出一個頂點。
(3) 如果不能執行規則1和規則2,就完成了整個搜尋過程。
bfs 廣度優先
1. 首先將根節點放入佇列中。
2. 從佇列中取出第一個節點,並檢驗它是否為目標。
如果找到目標,則結束搜尋並回傳結果。
否則將它所有尚未檢驗過的直接子節點加入佇列中。
3. 若佇列為空,表示整張圖都檢查過了——亦即圖中沒有欲搜尋的目標。結束搜尋並回傳“找不到目標”。
4. 重複步驟2。

上程式碼
class Program
    {

        public
class MyPoint { public MyPoint parent { get; set; } public int X { get; set; } public int Y { get; set; } public MyPoint(int a, int b) { this.X = a; this.Y = b; } } static
void WritePath(MyPoint p) { if (p.parent != null) { WritePath(p.parent); Console.Write("(" + p.X + "," + p.Y + ")-->"); } } static void Main(string[] args) { int[,] data = new int[,]{ //初始化資料 1為路 0為牆
{1,1,0,1,1}, {1,0,1,1,1}, {1,0,1,0,0}, {1,0,1,1,1}, {1,1,1,0,1}, {1,1,1,1,1} }; MyPoint p_bfs = new MyPoint(0, 0); p_bfs.parent = null; BFS(p_bfs, data); data = new int[,]{ //初始化資料 1為路 0為牆 {1,1,0,1,1}, {1,0,1,1,1}, {1,0,1,0,0}, {1,0,1,1,1}, {1,1,1,0,1}, {1,1,1,1,1} }; MyPoint p_dfs = new MyPoint(0, 0); p_dfs.parent = null; DFS(p_dfs, data); Console.Read(); } static void DFS(MyPoint qp,int[,] data) { for (int i = -1; i < 2; i++) //遍歷可以到達的節點 { for (int j = -1; j < 2; j++) { if ((qp.X + i >= 0) && (qp.X + i <= 5) && (qp.Y + j >= 0) && (qp.Y + j <= 4) && (qp.X + i == qp.X || qp.Y == qp.Y + j)) //是否越界 只遍歷上下左右 { if (data[qp.X + i, qp.Y + j] == 1) { if (qp.X + i == 5 && qp.Y + j == 4) //是否為終點 { Console.WriteLine(""); Console.Write("DFS:"); WritePath(qp); //遞迴輸出路徑 Console.Write("(5,4)"); } else { MyPoint temp = new MyPoint(qp.X + i, qp.Y + j); //加入佇列 temp.parent = qp; data[qp.X + i, qp.Y + j] = -1; DFS(temp,data); } } } } } } static void BFS(MyPoint p, int[,] data) { Queue q = new Queue(); data[0, 0] = -1; q.Enqueue(p); while (q.Count > 0) { MyPoint qp = (MyPoint)q.Dequeue(); for (int i = -1; i < 2; i++) //遍歷可以到達的節點 { for (int j = -1; j < 2; j++) { if ((qp.X + i >= 0) && (qp.X + i <= 5) && (qp.Y + j >= 0) && (qp.Y + j <= 4) && (qp.X + i == qp.X || qp.Y == qp.Y + j)) //是否越界 只遍歷上下左右 { if (data[qp.X + i, qp.Y + j] == 1) { if (qp.X + i == 5 && qp.Y + j == 4) //是否為終點 { Console.Write("BFS:(0,0)-->"); WritePath(qp); //遞迴輸出路徑 Console.Write("(5,4)"); Console.WriteLine(""); } else { MyPoint temp = new MyPoint(qp.X + i, qp.Y + j); //加入佇列 data[qp.X + i, qp.Y + j] = -1; temp.parent = qp; q.Enqueue(temp); } } } } } } } static void Dijkstra(MyPoint p, int[,] data) { //權值相同的時候 dijkstra 等同於 BFS } }