教你讀懂深度優先的套路

2021-08-17 20:18:40 字數 2330 閱讀 5194

a是當前獲得的部分解;

k是搜尋深度;

input是其它輸入;

is_a_solution(a,k,input)判斷當前的部分解向量a[1...k]是否是乙個符合條件的解;

construct_candidates(a,k,input,c,ncandidates)根據目前狀態,構造這一步可能的選擇,存入c陣列,其長度存入ncandidates;

process_solution(a,k,input)對於符合條件的解進行處理,通常是輸出、計數等;

make_move(a,k,input)和unmake_move(a,k,input)前者將採取的選擇更新到原始資料結構上,後者把這一行為撤銷。

//構造記錄座標的結構體

struct point

; bool operator==(const point&point)

return false;

}};//遞迴函式

void backtrack(vector>&board, int row, int column, point point, vector>&visit, vector&output)

//遞迴基

if (board[point.x][point.y] == 'x')

output.push_back(point);

visit[point.x][point.y] = 1;

//往右深入

point point1(point.x, point.y + 1);

if (point1.y=0) }

//往上深入

point point4(point.x - 1, point.y);

if (point4.x>=0) }

}void fliposurrendedbyx(vector>&board, int row, int column)

visit.push_back(vec1);

} for (int i = 0; i < row; ++i)

if (!discovered.empty())

}for (auto point : discovered)

}} }

return;

} int main()

input.push_back(vec1);

} fliposurrendedbyx(input, size, size);

for (auto& row:input)

cout << endl;

} system("pause");

return 0;

}測試結果如下:

(1)判斷當前解是否為有效解:當前解的大小和輸入序列的大小相同;

(2)是則輸出;

(3)不是的話,則根據當前的狀態,構造下乙個可能的取值;

(4)遞迴逐一的嘗試不同的取值。

//判斷是否是乙個合法的全排列

bool isanarrangement(vectorsolution, vectorinput)

} }else

return result;

}void backtrack(vectorsolution, vectorinput)

else

}//應注意去重

關於深度優先和廣度優先的問題

depth first search和breadth first search,即深度優先和廣度優先是圖的兩種搜尋的方法。其實與其說是方法,不如說是兩種思想。下面我們就來介紹這兩種思想。1 depth first search 深度優先是指在圖的查詢中,對每乙個分支深入到不能再深入為止,如果到達了終...

Python 樹的深度優先和廣度優先

廣度優先和深度優先 樹的節點,如果是第乙個,則為root節點 class node def init self,value self.val value self.left none self.right none 定義樹 class tree def init self self.root non...

類的繼承,深度優先於廣度優先

coding utf 8 class people object def init self self.age 45 print people def sleep self print 123 class relation object def init self print relation cl...