给出一个n, 请输出n的所有全排列,简单dfs(深搜问题)

/**
 *  给出一个n, 请输出n的所有全排列
 *    输入描述 Input Description
 *    读入仅一个整数n   (1<=n<=10)
 *    输出描述 Output Description
 *    一共n!行,每行n个用空格隔开的数,表示n的一个全排列。并且按全排列的字典序输出。
 *
 */

 

package algorithm.dfs;

import java.util.Scanner;

/**
 *  给出一个n, 请输出n的所有全排列
 *	输入描述 Input Description
 *	读入仅一个整数n   (1<=n<=10)
 *	输出描述 Output Description
 *	一共n!行,每行n个用空格隔开的数,表示n的一个全排列。并且按全排列的字典序输出。
 * @author guojm
 *
 */
public class AllPermutation {
	//存储全排列结果的数组
	static int value [] = new int[11];
	//记录数字是否使用过的访问数组
	static boolean visited[] = new boolean[11];
	//记录全排列结果总数的变量
	static int sum = 0;
	/**
	 * n代表输入的n的值,pos代表当前位置,
	 * pos== n+1代表超过n的位置了,即越界结束标志
	 * @param n
	 * @param pos
	 */
	public static void dfs(int n, int pos) {
		//如果当前深度达到了输入个数
		if( pos == n+1 ) {
			for(int i = 1; i <= n; i++) {
				System.out.print(value[i]);
			}
			System.out.println("  第"+(++sum)+"种全排列方式");
			return;
		} 
		for(int j = 1; j <= n; j++) {
			//判断当前j的值是否被访问,即value[]数组是否存储过j变量的值,visited[]数组的值默认为false;
			if(!visited[j]) {
				//当前值存入value[]数组
				value[pos] = j;
				//设置当前值已被使用
				visited[j] = true;
				//继续向下一层搜索,即递归实现深搜
				dfs(n, pos+1);
				//回溯部分,返回时必须设置当前j的值未访问
				visited[j] = false;
			}
		}
	}
	
    public static void main(String[] args) {
    	//动态初始化访问数组
    	/*for(int i = 0; i < 11; i++) {
    		visited[i] = false;
    	}*/
		@SuppressWarnings("resource")
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		dfs(n, 1);
	}
}

程序结果:
 给出一个n, 请输出n的所有全排列,简单dfs(深搜问题)_第1张图片

 

你可能感兴趣的:(常用算法)