DFS(深度優先搜尋)

Curtis_發表於2019-03-23

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

相關文章