【第0003页 · 递归】N皇后问题

【前言】本文以及之后的一些题解都会陆续整理到目录中,若想了解全部题解整理,请看这里:

第0003页 · N皇后问题

         今天我们来看一个著名的问题:N皇后问题。在此之前,我们先温习一下递归的思想。当然,温习的方式是看一道题目——全排列。

【全排列】现在给出 1 ~ n 这 n 个数,请问将这 n 个数排成一行共有多少种排法?例如:对于 1 ~ 3,可以有 (1,2,3)、(1,3,2)、(2,1,3)、(2,3,1)、(3,1,2)、(3,2,1) 6种排法。

【解题分析】这里我们用递归的思想。构造一个数组 P 用来存储当前排列的情况。再设一个数组 hash 用来标记哪些数已经放置在了当前的排列中,hash = 0 表示未放入,hash = 1 表示已放入。

        现在按照顺序往 P 数组的第 1 位到第 n 位放置数字。不妨假设当前已经填好了 1 ~ i 位,准备填 i + 1 位,那么就需要枚举 1 ~ n,如果这个数的 hash = 0,那么就可以将其放入第 i + 1 位,将其 hash 标记为 1,然后递归处理第 i + 2 位。注意:在这个递归结束后要将这个数的 hash 重新标记为 0。而递归的边界就是到达第 n + 1 位,此时说明 1 ~ n 位都已经填好了,我们定义一个数 cnt 用来记录排列种数。当到达边界时,cnt++。

【源码展示】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值