DFS(深度優先搜索)

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章