DFS_1:全排列问题

DFS_1:全排列问题

输出自然数 11 到 nn 所有不重复的排列,即 nn 的全排列,要求所产生的任一数字序列中不允许出现重复的数字。

输入格式

一个整数 nn。

输出格式

由 1 \sim n1∼n 组成的所有不重复的数字序列,每行一个序列。

每个数字保留 5 个场宽。

样例:

输入:

 3

输出:

     1    2    3
     1    3    2
     2    1    3
     2    3    1
     3    1    2
     3    2    1

注意的问题

	1.在java中的输出格式问题
	2.理解传入的dfs的参数是什么意思

做题的疑惑

1.为什么传入的参数是1,而不是那三个参数中的一个或者多个
2.那么传入的1是怎么进行dfs进行搜索的
import java.util.Scanner;
public class DFS_1 {
    static int N = 20 ;
    static int n;
    static int[] vis = new int[N];
    static int[] str;
    static int ans = 0;
    private static void dfs(int x){
        //边界条件
        if(x > n){
            ans++;
            print(str);
        }
        //执行递归
        /**
         * 此处的i=0或者i=1应该如何选择呢
         *      要是i是涉及到方向而不是涉及到本身也是需要使用的话,就可以i=0
         *      要是i涉及到数值本身的使用,例如本题123的全排序,就需要i=1开始
         *   其实说白了这本来就是一个差值用来当做循环的次数
         *   但是一旦被使用数值本身的话,就需要考虑起始值
         * */
        for (int i = 1; i <= n; i++) {
            /**
             * 担心释放掉假设进行回缩会重复步骤进入死循环?
             *      不用担心,这个for指明了当前的方向,若一次进入方向之后
             *      就不会进入该方向了
             * */
            if(vis[i]==0){//注意判断条件
                vis[i] = 1;
                /**
                 * str用来记住选择的路径
                 *
                 * */
                str[x] = i;
                dfs(x+1);
                /**
                 * 以下是回溯代码
                 *      为什么要回溯?
                 *      因为当你一条路走到黑的时候,因为避免重复设置了vis
                 *      当这一条路走完的时候,其他路径也是需要走这条路的话,
                 *      必须释放掉这个vis
                 * */
                vis[i] = 0;
            }
        }
    }
    private static void print(int[] str) {
        for (int i = 1; i <= n; i++) {
            System.out.print(str[i]);
        }
        System.out.println();
    }
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        n = scanner.nextInt();
        str = new int[N];
        /**
         * dfs(1)的意思是:假设一个原始的起点,然后dfs(1)这个1是搜索的第一层,然后进入递归之后一直到
         * 第n层,然后第n+1层结束。
         * 重点是:假设一个起点。记得是假设一个起点。dfs(1)已经是第一层的递归了
         * */
        dfs(1);
        System.out.println(ans);
    }
}

你可能感兴趣的:(算法_DFS,算法,dfs)