《算法笔记》第四章学习笔记
1、全排列问题
一般把1~n这n个整数按照某个顺序摆放的结果称为这n个整数的一个排列,全排列指这n个整数能形成的所有排列。如n=3时,全排列为(1,2,3),(1,3,2),(2,1,3),(2,3,1),(3,1,2),(3,2,1)。
全排列问题求解思路:
按照位数去递归。
设定数组P,用来存放当前的排列;散列数组hashTable,当整数x已经在数组P中时hashTable[x]为true。
当递归到第index位时,如果index等于N+1,那么输出数组P的每一位;否则,从1到N遍历,如果数字x为false,则第index位设定成x,hashTable[x] = true,之后递归处理第index+1位,当第index位为x的情况全部处理完后,还原hashTable[x],令hashTable[x] = false。
#include<stdio.h>
const int maxn = 11;
int n,P[maxn],hashTable[maxn] = {
false};
//当前处理排列的第index位
void generateP(int index){
if(index==n+1){
//如果是第N+1位,那么输出这个排列
for(int i = 1;i<=n;i++){
printf("%d",P[i]);
}
printf("\n");
return;
}else{
for(int i = 1;i<=n;i++){
//如果不是,那么遍历从1到N
if(hashTable[i]