万能的搜索

第一节:深度优先搜索

描述:输入一个数字m,输出1-m的全排列。

首先思考:假如有编号为1,2,3的三张扑克牌和编号为1,2,3的3个盒子,现在需要将这3张扑克牌分别放在3个盒子中有几种不同的方法。

步骤:首先走到1号盒子面前,是先放1号牌还是2号牌还是3号牌?现在要生成的是全排列,显然都要去尝试,现在规定一个顺序,每次到了一个盒子的面前,都先放1号,再放2号,最后放3号。

        首先走到1号盒子面前,先放1号牌放到1号盒子中,到2号盒子面前放2号牌,到3号盒子面前放3号牌。假如还有一个盒子叫做4号盒子,其实不需要这个4号盒子,因为放过3号盒子的3号牌,已经生成了一个排列。

        这个顺序就是“1,2,3”。

        是不是结束了,肯定不是了,拿你的脚指头想一下1,2,3这三个数字的全排列肯定不是一种。那我该怎么去想啊。

策略:产生一种全排列之后需要立即返回,退回到3号盒子面前,取回3好盒子中的扑克牌,再去尝试看看能不能放下其他号码的扑克牌,这个不用想,你手里只有一张3号的牌肯定没有其他的牌了,于是再退回一步,回到2号盒子面前

        取出2号盒子中的扑克牌,现在手里已经有了两张牌分别是2号和3号扑克牌,需要往2号盒子中放3号扑克牌,到3号盒子面前把手中的2号牌放进去,就又产生了一种排列“1,3,2”。

        好了啰嗦了一大会不知道大家听懂没有,下面上代码:

package 中介者设计模式;

import java.util.Scanner;

public class Main {

	static int [] a = new int[10];
	static int [] flag= new int [10];
	static int n = 0;
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		System.out.println("输入一个正整数");
		n = input.nextInt();
		dfs(1);//首先站在1号盒子的面前
		
	}

	/**
	 * 
	 * @param step 表示站在第几个盒子的面前
	 */
	
	private static void dfs(int step) {
		
		if (step == n+1) {//站在第n+1个盒子面前说明前面的盒子已经产生出来一种全排列了,大家应该知道这个4是干什么的了把
			//输出一种全排列
			for (int i=1;i<=n;i++) {
				System.out.print(a[i]);
				if (i != n) {
					System.out.print(",");
				}
			}
			System.out.println();
			return ;//这个return不能忘记了,返回调用的上一步
		}
		
		//站在第step的盒子面前怎么放那?
		//按照1,2,3顺序依次尝试这个就是我们定义的规则
		for (int i=1;i<=n;i++) {
			//判断i号扑克牌在手上没有
			if (flag[i] == 0) {//标识i号牌在手上
				//开始尝试i
				a[step] = i;//将i号扑克牌放到step号盒子中
				flag[i] = 1;//不在手上了
				
				//第step盒子已经放好了,需要走到下一个盒子面前
				dfs(step+1);
				flag[i] = 0;//这个就是退回收回扑克的操作。
				
				
				
				
			}
		}
		
	
	}
	
}

  

原文地址:https://www.cnblogs.com/airycode/p/4810049.html