1.全排列问题
题目描述
按照字典序输出自然数 1 到 n 所有不重复的排列,即 n 的全排列,要求所产生的任一数字序列中不允许出现重复的数字。
输入格式
一个整数 n。
输出格式
由 1∼n 组成的所有不重复的数字序列,每行一个序列。
每个数字保留 5 个场宽。
说明/提示 1≤n≤9。
package shen_du_you_xian_sou_suo;
import java.text.DateFormatSymbols;
import java.util.Scanner;
// 递归 全排列
public class L1_1 {
//定义总体变量,dfs方法也能使用
private static int n;
private static int[] arr = new int[9]; //进行存放
private static int[] num = new int[9]; //进行标记
public static void main(String[] args) {
//输入n值
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
//先用0填充数组num[]
for(int i=0;i<9;i++) {
num[i]=0;
}
//固定第一个数字
dfs(1);
}
public static void dfs(int step) {
//当个数大于n时结束排列并输出arr[]
if(step==n+1) {
for(int i=1;i<=n;i++) {
System.out.print(arr[i]+" ");
}
//换行
System.out.println();
return;
}
for(int i=1;i<=n;i++) {
//当num的元素为0时,表示还没有插入数字
if(num[i]==0) {
//把数字i固定在第step个位置上
arr[step]=i;
//将第i个数字进行标记,标记为1表示已经确定了
num[i]=1;
//固定第step+1个数字
dfs(step+1);
//固定好后在标记为0
num[i]=0;
}
}
}
}
蓝桥真题
2.图书排列
题目描述
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
将编号为 1 ~ 10 的 10 本书排放在书架上,要求编号相邻的书不能放在相邻的位置。
请计算一共有多少种不同的排列方案。
运行限制
最大运行时间:1s
最大运行内存: 128M
用和上面一样的方法算出结果,最后输出就可以了(答案是479306)
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
private static int n = 10;
private static int sum = 0;
private static int[] arr = new int[11]; //进行存放
private static int[] num = new int[11]; //进行标记
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//在此输入您的代码...
for(int i=0;i<9;i++) {
num[i]=0;
}
dfs(1);
System.out.println(sum);
// System.out.println(479306);
scan.close();
}
public static void dfs(int step) {
if(step==n+1) {
sum++;
for(int i=1;i<n;i++){
if(arr[i]+1==arr[i+1] || arr[i]-1==arr[i+1]){
sum--;
break;
}
}
return;
}
for(int i=1;i<=n;i++) {
if(num[i]==0) {
arr[step]=i;
num[i]=1;
dfs(step+1);
num[i]=0;
}
}
}
}