C# BFS DFS 迷宮尋徑 深度優先演算法 廣度優先演算法
阿新 • • 發佈:2019-02-18
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
}
}