原创 用BFS解決迷宮問題

在一個n*n的矩陣裏走,從原點(0,0)開始走到終點(n-1,n-1),只能上下左右4個方向走,只能在給定的矩陣裏走,求最短步數。n*n是01矩陣,0代表該格子沒有障礙,爲1表示有障礙物。 int mazeArr[maxn][maxn

原创 A*算法的原理和實現

一:A*的介紹 A*算法是一種啓發式搜索算法,就是在狀態空間中的搜索對每一個搜索的位置進行評估,得到最好的位置,再從這個位置進行搜索直到目標。這樣可以省略大量無畏的搜索路徑,提到了效率。在啓發式搜索中,對位置的估價是十分重要的。採用了不同

原创 如何實現廣度優先遍歷(BFS)

BFS過程: 一:訪問頂點V,並標記V爲已經訪問 二:頂點V入隊列 三:如果隊列非空,進行執行,否則算法結束 四:出隊列取得對頭頂點u,如果頂點未被訪問,就訪問該頂點,並標記該頂點爲已經訪問 五:查找u的第一個鄰接節點w 六:如果w不存在

原创 如何實現深度優先遍歷(DFS)

DFS實現步驟如下: ①訪問頂點V,並標記V已經訪問 ②查找V的第一個鄰接頂點w ③若W存在,則繼續執行,否則算法結束 ④若W未被訪問,則使用DFS遞歸訪問w ⑤查找V的下一個鄰接節點,並記爲W,轉到步驟③ 對上圖進行DFS,則訪問順序

原创 如何實現二叉樹層次遍歷

核心思想: 首先,將二叉樹的最祖先節點入隊列 然後,循環執行以下步驟,知道隊列空。 一:節點出隊列 二:該節點如果有左孩子節點,左孩子節點入隊列 三:該節點如果有右孩子節點,右孩子節點入隊列 void LayerOrder(BiTree

原创 POJ 1979 Red and Black (深度優先遍歷)

Red and Black Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 22768   Accepted: 12286 Description Ther

原创 Floyd算法的原理和實現

一.算法介紹 Floyd算法是一種在有向圖中求最短路徑的算法。相比不能再有向圖中包含負權值的dijkstra算法,Floyd算法可以用在擁有負權值的有向圖中求解最短路徑(不過不能包含負權迴路)。它是一種求解有向圖中點與點之間最短路徑的算法

原创 基數排序(採用鏈表)

基於兩兩比較的算法,算法的運行下界爲Ω(nlogN),如果想再降低時間複雜度,只能通過其他的非基於比較的方法。基數排序就是一種方法,其時間複雜度爲O(N) 基數排序的過程,假設有4個數,我們用鏈表把他們連一起,這4個數爲 321  89

原创 直接插入排序(遞歸與非遞歸2種實現方法)

一個數組有n個元素,假如前面n-1個元素已經排序好了,那麼把第n個元素插入到前面n-1個元素,使得數組有序排列,就是插入排序了。 至於n-1個元素如何已經先排序好,那麼我們可以假設前面n-2個元素已經排序好,把第n-1個元素插入到前面n-

原创 圖的鄰接矩陣存儲結構

如上圖,我們可以把v0標記爲0,v1標記爲1。。。。 並把聯通的2點權值全設置爲1,那麼可以用鄰接矩陣(右圖)來表示 概念解析: 第一個鄰接頂點: 我們以vo爲例,第一個鄰接頂點爲V1(其實也可以使V3,只不過考慮計算機的存儲順序,我們

原创 編程判斷一個樹是完全二叉樹(使用層次遍歷實現)

完全二叉樹:一棵具有N個節點的二叉樹的結構與滿二叉樹的前N個節點的結構相同 如何判斷一個樹是完全二叉樹 可以使用層序遍歷,只需2個步驟 第一步:如果遍歷到一個節點只有右子樹沒有左子樹,則不是完全二叉樹 第二部:如果遍歷到一個節點只有左

原创 二路歸併排序(也叫合併排序)

下面這圖展示了二路歸併的過程 二路歸併的核心代碼是merge()函數 它將2個分割的數組有序的合併在一起 如圖: 在數組A中, 從p到q是一個數組,從q到r是另外一個數組 那麼如何將這2個數組有序的合併在一起,組個新的數組A呢? 步驟:

原创 快速排序(遞歸與分治的思想)

快排具有遞歸和分治的思想,實現步驟如下。 第一步:對數組A中的第一個元素x執行操作,使得數組變成新的數組B,B中C段表示小於x的元素,D段表示大於x的元素 第二步:把C段,D段,當成2個獨立的數組,然後對這2個數組執行類似於第一步中A的操

原创 堆棧的鏈式表示和實現

#include<iostream> using namespace std; typedef char DataType; //記得加分號 typedef struct snode { DataType x; struct sn

原创 如何求2叉樹葉子節點(遞歸)

核心代碼: int leaf(BiTreeNode *head) { if(head==NULL) return 0; //當前節點爲空,返回0 else { if(head->LeftChild==NULL && head-