深度優先搜尋 (Depth First Search 簡稱:DFS)

weixin_51671500發表於2020-11-29

深度優先搜尋 (Depth First Search 簡稱:DFS)


1.搜尋演算法

利用計算機的高效能有目的地的列舉一個問題的部分或者所有可能情況,從而找到解決問題的方法

2.窮舉法(列舉法):典型的搜尋演算法

在我們遇到的一些問題當中,有些問題我們不能夠確切的找出數學模型,即找不出一種直接求解的方法,解決這一類問題,我們一般採用搜尋的方法解決。搜尋就是用問題的所有可能去試探,按照一定的順序、規則,不斷去試探,直到找到問題的解,試完了也沒有找到解,那就是無解,試探時一定要試探完所有的情況,這就是窮舉。
  • 案例:列印1,2,3的全排列
//三層for迴圈巢狀,當三個數兩兩都不相等時列印這三個數  
for (int i = 1; i <= 3; i++)
			for (int j = 1; j <= 3; j++)
				for (int k = 1; k <= 3; k++)
					if (i != j && i != k && j != k)
						System.out.println(i + "" + j + "" + k);
//列印結果
123
132
213
231
312
321

  • 擴充:列印1-9的全排列
int num=0;	//用於計數
		for (int i = 1; i <= 9; i++)
			for (int j = 1; j <= 9; j++)
				for (int k = 1; k <= 9; k++)
					for(int l=1;l<=9;l++)
						for(int m=1;m<=9;m++)
							for(int n=1;n<=9;n++)
								for(int o=1;o<=9;o++)
									for(int p=1;p<=9;p++)
										for(int q=1;q<=9;q++)
											if (i != j && i != k && i!=l&&
											i!=m&&i!=n&&i!=o&&i!=p&&i!=q&&
											j!=k&&j!=l&&j!=m&&j!=n&&j!=o&&
											j!=p&&j!=q&&
											k!=l&&k!=m&&k!=n&&k!=o&&k!=p&&
											k!=q&&
											l!=m&&l!=n&&l!=o&&l!=p&&l!=q&&
											m!=n&&m!=o&&m!=p&&m!=q&&
											n!=o&&n!=p&&n!=q&&
											o!=p&&o!=q&&
											p!=q) {
												num++;
												System.out.println(
														i+""+j+""+k+""+l+""+m+""
														+n+""+o+""+p+""+q
														);
											}
		System.out.println("共有"+num+"種……")

3.深度優先搜尋

深度優先搜尋用一個陣列存放產生的所有狀態。
(1) 把初始狀態放入陣列中,設為當前狀態;
(2) 擴充套件當前的狀態,產生一個新的狀態放入陣列中,同時把新產生的狀態設為當前狀態;
(3) 判斷當前狀態是否和前面的重複,如果重複則回到上一個狀態,產生它的另一狀態;
(4) 判斷當前狀態是否為目標狀態,如果是目標,則找到一個解答,結束演算法。
(5) 如果陣列為空,說明無解。
  • 案例:1~9的全排列
    static int n;		
	
	
    static int box[]=new int[n+1];	
    static int card[]=new int[n+1]; 
    static int num=0;

    public static void main(String[] args) {
        n=9;
        
        dfs(1);
        System.out.println(num);
    }

    
    static void dfs(int id){
        //判斷邊界
        if(id==n+1){
            for(int i=1;i<=n;i++)
                System.out.print(box[i]);
            System.out.println();
            num++;
        }
        for(int j=1;j<=n;j++){
            
            if(card[j]==0){
                box[id]=j;
                
                card[j]=1;
                dfs(id+1);
               
                card[j]=0;
            }
        }
    }

4.深度優先搜尋的基本模型

void dfs(int step){
    判斷邊界
    利用迴圈嘗試每一種可能(for i=1;i<=n;i++){
        繼續下一步 def(step+1)	//遞迴,自己呼叫自己
    }
    返回
}
  • 擴充:將數字1~9填入'□'使得□□□ + □□□ =□□□成立
解題思路
根據深度優先搜尋的基本模型設定判斷邊界
    static int n;
    static int a[]=new int[10];
    static int book[]=new int[10];
    static int num=0;

    public static void main(String[] args) {
        n=9;
        dfs(1);
        System.out.println(num);
    }

    
    static void dfs(int step){

        if(step==10){
        	boolean flag=a[1]*100+a[2]*10+a[3]+a[4]*100+a[5]*10+a[6]==a[7]*100+a[8]*10+a[9];
        	if(flag) {
        		System.out.println(
        				a[1]+""+a[2]+""+a[3]+"+"
        				+a[4]+""+a[5]+""+a[6]+"="
        				+a[7]+""+a[8]+a[9]);
        		num++;
        	}
            
        }
        for(int j=1;j<=n;j++){
            if(book[j]==0){
                a[step]=j;
                book[j]=1;
                dfs(step+1);
                book[j]=0;
            }
        }
    }

相關文章