DFS(深度優先搜索):
深度優先搜索算法(英語:Depth-First-Search,簡稱DFS)是一種用於遍歷或搜索樹或圖的算法。 沿着樹的深度遍歷樹的節點,儘可能深的搜索樹的分支。當節點v的所在邊都己被探尋過或者在搜尋時結點不滿足條件,搜索將回溯到發現節點v的那條邊的起始節點。整個進程反覆進行直到所有節點都被訪問爲止。屬於盲目搜索,最糟糕的情況算法時間複雜度爲O(!n)。(一條路走到黑,直到走不下去才往回走)
基本模板:
int check(參數)
{
if(滿足條件)
return 1;
return 0;
}
void dfs(int step)
{
判斷邊界
{
相應操作
}
嘗試每一種可能
{
滿足check條件
標記
繼續下一步dfs(step+1)
恢復初始狀態(回溯的時候要用到)
}
}
1、例題:
馬虎的算式:
小明是個急性子,上小學的時候經常把老師寫在黑板上的題目抄錯了。
有一次,老師出的題目是:36 x 495 = ?
他卻給抄成了:396 x 45 = ?
但結果卻很戲劇性,他的答案竟然是對的!!
因爲 36 * 495 = 396 * 45 = 17820
類似這樣的巧合情況可能還有很多,比如:27 * 594 = 297 * 54
假設 a b c d e 代表1~9不同的5個數字(注意是各不相同的數字,且不含0)
能滿足形如: ab * cde = adb * ce 這樣的算式一共有多少種呢?
請你利用計算機的優勢尋找所有的可能,並回答不同算式的種類數。
滿足乘法交換律的算式計爲不同的種類,所以答案肯定是個偶數。
答案直接通過瀏覽器提交。
注意:只提交一個表示最終統計種類數的數字,不要提交解答過程或其它多餘的內容。
2、代碼:(DFS)
#include <iostream>
#include <algorithm>
using namespace std;
int vis[10];
int a[5];
int cnt;
bool judge(){
int t1=(a[0]*10+a[1])*(a[2]*100+a[3]*10+a[4]);
int t2=(a[0]*100+a[3]*10+a[1])*(a[2]*10+a[4]);
if(t1==t2) return true;
return false;
}
void dfs(int pos){
if(pos==5){
if(judge()) cnt++;
return;
}
for(int i=1;i<=9;i++){//注意搜索範圍是1~9
if(vis[i]==0){
a[pos]=i;
vis[i]=1;
dfs(pos+1);
vis[i]=0;
}
}
}
int main() {
dfs(0);
cout<<cnt;
return 0;
}
3、結果:
來源:https://blog.csdn.net/qq_39825375/article/details/86617438