第5節 寶島探險
利用廣度優先搜尋實現
其中可以不用開闢visit變數,直接用將本身的值改為-1,然後判斷即可
注意輸入資料時周圍加了一層-1,作為邊界
廣度優先搜尋
利用深度優先搜尋實現,注意下面的方法是將搜尋到的點著成-1的顏色
深度優先搜尋
注意如果n和m比較大的話,建議用廣度優先搜尋,
由於深度優先搜尋,一直按照深度優先下去,故最壞情況為n*m,
而廣度優先搜尋,的最壞情況是max(n,m)
關於求小島的數量,只需要對每個點遍歷一邊,如果該點是陸地的話,進行深度優先搜尋
#include #include求小島的數量#include
#include
#include
using
namespace
std;
int dx = ;
int dy = ;
typedef pair
point;
typedef vector
int> >vectorarray;
void dfs(int x, int y, vectorarray&a)
}}int
main()
}int ans = 0
;
for(int i = 1; i <= n; ++i)}}
cout
}
第6節 水管工遊戲
直管有兩種,進水口有4種可能,上下左右,每種進水口對應的出水口只有一種可能
彎管有4種,進水口有4種可能,上下左右, 每種進水口對應的出水口有兩種可能,因為彎管可以旋轉
然後深度搜尋每種可能
#include #include水管工遊戲#include
#include
#include
using
namespace
std;
typedef pair
point;
typedef vector
int> >vvi;
typedef vector
bool> >vvb;
stack
res;
intn,m;
vector
>solutions;
bool flag = false
;void dfs(int x, int y, int direction,vvi& a, vvb&visit)
cout
<
return
; }
if(visit[x][y]) return
; visit[x][y] = true
; res.push(point(x,y));
if(a[x][y] == 5 || a[x][y] == 6
) }
if(a[x][y]>=1 && a[x][y] <= 4
)
case
2:
case
3:
case
4: }
}visit[x][y] = false
; res.pop();
return;}
intmain()
}dfs(
1,1,1
,a,visit);
if(!flag) cout<
impossible
"<
}
啊哈演算法 萬能的搜尋 解救小哈DFS
迷宮由n行m列的單元格組成 n和m都小於50 每個單元格要麼是空地,要麼是障礙物。你的任務是幫助小哼找到一條從迷宮的起點通往小哈所在位置的最短路徑。障礙物不能走,且不可走到迷宮外 啊哈演算法 解救小哈 include int n,m,p,q,min 99999999 把min設定成很大的數 int ...
《啊哈!演算法》第7章 神奇的樹
把n個元素建立乙個堆,首先將這n個結點以自頂向下 從左到右的方式從1到n編碼,這樣可以把n個結點轉換成一顆完全二叉樹 緊接著從最後乙個非葉子結點 結點編號為n 2 開始到根節點 結點編號為1 逐個掃瞄所有結點,根據需要將當前結點向下調整,直到以當前結點為根結點的子樹符合堆的特性。include in...
演算法導論 第4章
這一章,就乙個主題,什麼是遞迴式?如何求解遞迴式?遞迴式,就是乙個函式,自己呼叫自己,但是有乙個最基本的情況,這種情況下,它就會自動返回跳出遞迴。用什麼方法?3種方法 1.代換法 2.遞迴樹方法 3.主方法 關於代換法 乙個字,猜,也就是你會蒙?怎麼蒙?需要你的經驗。也就是說,有經驗的人,一看就知道...