2022-03-21

习题笔记:全排列问题(洛谷1706);

题目:

题目描述

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

输入格式

一个整数 nn。

输出格式

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

每个数字保留 55 个场宽。

输入输出样例

输入 #1

3

输出 #1

    1    2    3

    1    3    2

    2    1    3

    2    3    1

    3    1    2

    3    2    1

(n>=1&&n<=9);

解析:

先定义一些值(全局变量):

public class{ static int n;

static boolean[] isUsed = new boolean[10];//用来判断相应数字有没有被使用过

static int[] res = new int[10]; //用来存储结果

}

输入数值: public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

n = sc.nextInt();

a(0);

}

定义一个方法:

public static void a(int now) {//now代表现在res数组里有几个数字,也可以理解为当前索引

if (now == n ) {//当now == n 时,就说明已经满了,直接输出即可

print();

return;

}

判断:

for (int i = 0; i < n; i++) {

if (!isUsed[i]) {//判断是否被用过

isUsed[i] = true;//既然进来了,就设为使用过了

res[now] = i + 1;//因为n是1-9,所有i+1

a(now+1);//加入后now+1

//最后回溯是对isUsed[i]回溯;如果写成isUsed[now]的话

//由于每次回溯时now==n,所以写成isUsed[now]的话其实每次就只把最后一个数置为false

isUsed[i] = false;//回溯

}

输出:

//输出

public static void print() {

for (int i = 0; i < n; i++) {

System.out.print(" "+res[i]);

}

System.out.println();

}

你可能感兴趣的:(2022-03-21)