ACWing842. 排列数字(深搜模板题)

Posted !0 !

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ACWing842. 排列数字(深搜模板题)相关的知识,希望对你有一定的参考价值。

题目链接:https://www.acwing.com/problem/content/844/

1.思路

这是一道深搜的模板题,第一次接触的话会有点难以理解,但是这个思想还是要掌握的。

这题是要我们用1~n这些数字填充n个位置并且不能出现重复数字。我们可以先将1填入第一个位置,然后再将2填入第二个位置,直到填完所有位置,我们就找到了一组答案,我们答案用path数组存储,接下来我们就要回溯了,我们用v数组来记录每个数是否已经用过,如果当前数用过就跳过,判断下一个数是否用过,一直回溯直到找到答案。

不理解的话可以直接看代码,也许思路会清晰很多。

2.代码模板

import java.util.*;
public class Main {
    static boolean[] v = new boolean[10];	//当前数是否已经被填充
    static int[] path = new int[10];	//保存路径
    static int n;
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        n = in.nextInt();
        dfs(0);
    }
    public static void dfs(int i) {
        if(i == n) {	//如果已经填满了所有数字
            for(int j = 0; j < n; j++)
                System.out.print(path[j] + " ");
            System.out.println();
            return;
        }
        for(int j = 1; j <= n; j++) {	//从1到n找到没有被填过的数字
            if(!v[j]) {			//如果j没被填过
                path[i] = j;	//将j填入第i个位置
                v[j] = true;	//表示这个数已经被填入答案之中
                dfs(i + 1);		//开始填充下一个位置
                v[j] = false;	//回溯,假如这个位置不填j
            } 
        }
    }
}

3.复杂度分析

  • 时间复杂度:O(n * n!)
  • 空间复杂度:O(n)

以上是关于ACWing842. 排列数字(深搜模板题)的主要内容,如果未能解决你的问题,请参考以下文章

AcWing 842. 排列数字(DFS)

AcWing842 排列数字

AcWing 842. 排列数字 DFS

842. 排列数字

DFS+剪枝Aw842.排列数 & Aw843.N-皇后问题

DFS题目总结