搜索

廣度優先搜索:

廣度優先搜索會先考慮每種狀態的和初始狀態的距離說人話:與初始狀態越接近的狀況就越會優先考慮,每一個狀態要作的事情就是上個狀態的擴展。常常是有隊列實現,每次取出隊首找出隊首的擴展狀態將其壓入隊列,知道隊列空。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(下一種狀況);
		恢復現場;
	}
}
相關文章
相關標籤/搜索