廣度優先搜索會先考慮每種狀態的和初始狀態的距離說人話:與初始狀態越接近的狀況就越會優先考慮,每一個狀態要作的事情就是上個狀態的擴展。常常是有隊列實現,每次取出隊首找出隊首的擴展狀態將其壓入隊列,知道隊列空。node
廣搜模板:數組
int bfs(int sx,int sy) { Q.push((node){sx,sy}); //起點加入隊列 vis[sx][sy]=true; //標記 while(!Q.empty()) { node s = Q.front();//獲取起始座標 Q.pop(); //彈出隊列 if(符合條件) return ans(答案); for(枚舉可能的狀態){//找到因此的能夠擴展的狀態 if(不符合條件) continue; //不符合條件跳過循環 /*注意:這個大部分是判斷有沒有越界之類的,分開寫更保險,由於若是有下標爲負數的話,那麼可能會判RE(沒有數組下標是負數,除非是用了指針之類的)*/ //可行的狀況 if(合法) Q.push((node){tx,ty}); //加入隊列 } } }
深度優先搜索其實就是暴力枚舉的優化版本,深度優先搜索從一種狀況一直走下去,直到錯誤了或者是已是答案時就再也不枚舉(返回上一層尋找還有沒有其餘的解,直到因此可能可行的狀況都試過爲止)。優化
//模板: void dfs(int x){ if (邊界條件){記錄答案/最優解;return;} for(各類狀況) { if(知足){ 保存記錄; dfs(下一種狀況); 恢復現場; } }