dfs;
當知道初始和目標狀態的,用雙向bfs:
無權圖最好用bfs
不用重複如隊
ps: 我一開始也寫過,不過真心覺得他寫的好
1、對於初始狀態入隊,設定初始狀態為已訪問
2、如果佇列不為空時,出隊隊頭元素,否則跳到第5步
3、檢查出隊的元素是否為最終解,如果是則跳到第5步。
4、對於出隊的元素,檢查所有相鄰狀態,如果有效並且未訪問,則將
所有有效的相鄰狀態進行入隊,並且設定這些狀態為已訪問,然後
跳到第2步重複執行
5、檢查最後出隊的元素是否為最終解,如果是輸出結果,否則說明無解
通常用佇列(先進先出,fifo)實現
初始化佇列q;
q = ;標記s為已訪問;
while(q為非空)
所有與now 相連 並 且未被訪問的點進入佇列(沒被標記);
並標記now已訪問;
}題目描述
一矩形陣列由數字0到9組成,數字1到9代表細胞,細胞的定義為沿細胞數字上下左右若還是細胞數字則為同一細胞,求給定矩形陣列的細胞個數。(1<=m,n<=100)?
輸入輸出格式
輸入格式:
輸入:整數m,n(m行,n列)
矩陣輸出格式:
輸出:細胞的個數
/*4 10
0 2 3 4 5 0 0 0 6 7
1 0 3 4 5 6 0 5 0 0
2 0 4 5 6 0 0 6 7 1
0 0 0 0 0 0 0 0 8 9
*/
#include
#define maxn 100
int m,n,cnt =0;
char s[maxn]
;int a[maxn]
[maxn]
,vis[maxn]
[maxn]
;int q[maxn]
;int movex[5]
=;int movey[5]
=;void
bfs(
int x,
int y)}}
}}intmain()
}for
(int i =
1; i <= n; i++)}
}}printf
("%d"
,cnt)
;}
通常搜出組合方式,求最優解的時候,我們考慮用dfs
資料結構:系統棧;
兩種基本的搜尋
搜尋是個 暴力的 好東西,學一學還是很有必要滴 首先就是dfs了,這是個好東西 一般來說,它分為3個階段 遞迴 回溯 dfs dfs的過程就類似於走迷宮時死磕一條路,除非走到死胡同,不然一直走下去,並且它會把所有可走的路都走一遍,因此它的效率不高,所以我們通常會加一些優化。最常用的是剪枝和記憶化 剪...
組合的兩種遞迴演算法
組合就是從n個物品中任意選擇m個組成一組,下面兩種遞迴演算法都可以求出不同的組合,如果待選物品當中有重複的,比如說下面 中an new char 變成 an new char,這兩種演算法依然有效,只不過要加一步去重複。tip 如果給出的陣列元素不是數字,比如是a,b,c,d,可以直接用陣列下標來進...
快速冪的兩種演算法
快速冪是一種在o logn 的時間複雜度下求出冪的一種方法。第一種算方法就是對於乙個x n我們可以把n轉化成2進製的形式,如x 22 x 16 x 4 x 2 因為22 二進位制 10110 16 4 2 所以我們可以推到出來這種演算法,完整 如下 typedef long long ll ll m...