一、全排列
题目:按照字典序输出自然数 1到 n 所有不重复的排列,即 n 的全排列,要求所产生的任一数字序列中不允许出现重复的数字。
输出格式
由 1∼ n 组成的所有不重复的数字序列,每行一个序列。
当n为三时,输出样例为:
1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1
本算法中用的是递归和回溯,其中定义了两个数组,一个数组用来存放数,另一个用来标记元素是否被用过。
public class 全排列 {
public static int a[]=new int[10] ;//定义一个数组,用来标记元素是否被用过
public static int b[]=new int[10] ;//用来存放解
public static int n=3;//n个数
public static void dfs(int k) {
//深度优先遍历
//当填满的时候
if(k==n+1) {
for(int i=1;i<=n;i++) {
System.out.print(b[i]+" ");
}
System.out.println("\n");//换行
return;
}
//当没有填满的时候
for(int i=1;i<=n;i++) {
if(a[i]==0){
b[k]=i;//将这个数填入数组
a[i]=1;
dfs(k+1);
a[i]=0;//回溯
}
}
}
public static void main(String[] args) {
for(int i=0;i<n;i++) {
a[i]=0;
}
dfs(1);
}
}
二、图书排列问题
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
将编号为 10 本书排放在书架上,要求编号相邻的书不能放在相邻的位置。
请计算一共有多少种不同的排列方案。
运行限制
最大运行时间:1s
最大运行内存: 128M
给图书排序,要求编号相同的书不能放在相邻的位置,大体思路还是全排列,因为编号相邻的书不能放在相同的位置所以要写一个if语句判断一下,如果不符合条件,count--。
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static int[] arr=new int[11];
public static int[] num=new int[11];
static int n=10;
static int count=0;
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
//在此输入您的代码...
for(int i=0;i<10;i++) {
num[i]=0;
}
dfs(1);
System.out.println(count);
scan.close();
}
public static void dfs(int k) {
if(k==n+1) {
count++;
for(int i=1;i<n;i++){
if(arr[i]+1==arr[i+1] || arr[i]-1==arr[i+1]){
count--;
break;
}
}
return;
}
for(int i=1;i<=10;i++) {
if(num[i]==0){//当元素没有被用时,才能进行以下操作
arr[k]=i;
num[i]=1;
dfs(k+1);
num[i]=0;
}
}
}
}
