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. 排列数字(深搜模板题)的主要内容,如果未能解决你的问题,请参考以下文章