package com.xjj.Ah;
import java.util.Scanner;
/*-----搜索--深度优先搜索------卡牌盒子形式--
* 1. 深度优先搜索关键:当下该怎么做,下一步与当下相同;
* 2. 基本模型
* void dfs(int step)
* {
* 判断边界--return
* 尝试每一种可能
* for(int i = 1; i <= n; i++)
* {
* 继续下一步 dfs(step+1);
* }
* 返回
* }
*
*
* 3. 此题为全排列:
* 分析为:将待排列的数放入盒子a[],book[]标记是否放入,深度放入,如全部放入则输出并拿出前一个...
*
*
* */
public class Ah_4_1 {
int[] a = new int[10]; //装数的盒子
int[] book = new int[10]; //标记法,=0表示卡牌在手,=1表示卡牌放入盒子
static int n;
static int sum = 0;
public void dfs(int step){
//在n+1个盒子前,无卡牌则表示前n个盒子已经放好,则输出一种排列
if (step == n+1) {
sum++;
for(int i = 1; i <= n; i++)
System.out.print(a[i]);
//一定要,返回之前的一步,递归跳出条件
System.out.println();
return;
}
//枚举出n种可能
for(int i = 1; i <= n; i++){
if (book[i] == 0) { //表示卡牌还在手
a[step] = i;
book[i] = 1; //卡牌放入盒子
dfs(step + 1); //递归调用下一个盒子
book[i] = 0; //把放入的卡牌收回,才能进行下一步
}
}
}
public static void main(String[] args) {
System.out.println("输入n(1~9):");
Scanner scanner = new Scanner(System.in);
n = scanner.nextInt();
Ah_4_1 ah = new Ah_4_1();
ah.dfs(1);
System.out.println("共有排列: " + sum);
}
}
搜索--全排列
最新推荐文章于 2024-11-13 11:32:41 发布