深度优先搜索 (Depth First Search 简称:DFS)

深度优先搜索 (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;
            }
        }
    }

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页