习题笔记:全排列问题(洛谷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();
}