递归法求解全排列、N皇后

《算法笔记》第四章学习笔记

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]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值