2021-02-16:n皇后问题。给定一个整数n,返回n皇后的摆法有多少种?
福哥答案2021-02-16:
自然智慧即可。
1.普通递归。有代码。
需要判断同列和斜线。
2.位运算递归。有代码。
3.我的递归。有代码。
只需要判断斜线。
代码用golang编写,代码如下:
package main import (
"fmt"
"time"
) func main() {
n := 12
fmt.Println(n, "皇后问题")
fmt.Println("------")
now := time.Now()
fmt.Println("1.普通递归:", num1(n))
fmt.Println("时间:", time.Now().Sub(now))
fmt.Println("------") now = time.Now()
fmt.Println("2.位运算递归:", num2(n))
fmt.Println("时间:", time.Now().Sub(now))
fmt.Println("------")
now = time.Now()
fmt.Println("3.我的递归:", num3(n))
fmt.Println("时间:", time.Now().Sub(now))
}
func num1(n int) int {
if n < 1 {
return 0
}
record := make([]int, n)
return process1(0, record, n)
}
func process1(i int, record []int, n int) int {
if i == n {
return 1
}
res := 0
for j := 0; j < n; j++ {
if isValid(record, i, j) {
record[i] = j
res += process1(i+1, record, n)
}
}
return res
}
func isValid(record []int, i int, j int) bool {
for k := 0; k < i; k++ {
if j == record[k] || abs(record[k]-j) == abs(i-k) {
return false
}
}
return true
}
func abs(a int) int {
if a < 0 {
return -a
} else {
return a
}
} func num2(n int) int {
if n < 1 || n > 32 {
return 0
}
limit := -1
if n != 32 {
limit = (1 << n) - 1
}
return process2(limit, 0, 0, 0)
}
func process2(limit int, colLim int, leftDiaLim int, rightDiaLim int) int {
if colLim == limit {
return 1
}
pos := limit & (^(colLim | leftDiaLim | rightDiaLim))
mostRightOne := 0
res := 0
for pos != 0 {
mostRightOne = pos & (^pos + 1)
pos = pos - mostRightOne
res += process2(limit, colLim|mostRightOne, (leftDiaLim|mostRightOne)<<1,
(rightDiaLim|mostRightOne)>>1)
}
return res
} func num3(n int) int {
rest := make([]int, n)
record := make([]int, n)
for i := 0; i < n; i++ {
rest[i] = i
}
ansval := 0
ans := &ansval
process3(record, 0, rest, ans)
return *ans
}
func process3(record []int, recordLen int, rest []int, ans *int) {
restLen := len(rest)
if restLen == 0 {
*ans++
return
}
for i := 0; i < restLen; i++ {
isValid := true
for j := 0; j < recordLen; j++ {
//不需要看同行和同列,只需要考虑斜线
if abs(j-recordLen) == abs(record[j]-rest[i]) {
isValid = false
break
}
}
if isValid {
record[recordLen] = rest[i]
restCopy := make([]int, restLen)
copy(restCopy, rest)
restCopy = append(restCopy[:i], restCopy[i+1:]...)
process3(record, recordLen+1, restCopy, ans)
}
} }
执行结果如下:
***
[左神java代码](https://github.com/algorithmzuo/algorithmbasic2020/blob/master/src/class23/Code03_NQueens.java)
[评论](https://user.qzone.qq.com/3182319461/blog/1613432317)
2021-02-16:n皇后问题。给定一个整数n,返回n皇后的摆法有多少种?的更多相关文章
- 给定一个整数N,找出一个比N大且最接近N,但二进制权值与该整数相同 的数
1,问题描述 给定一个整数N,该整数的二进制权值定义如下:将该整数N转化成二进制表示法,其中 1 的个数即为它的二进制权值. 比如:十进制数1717 的二进制表示为:0000 0110 1011 01 ...
- LeetCode竞赛题:K 次取反后最大化的数组和(给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次。)
给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次.(我们可以多次选择同一个索引 i.) 以这种方式修改数组后 ...
- 给定一个整数,求解该整数最少能用多少个Fib数字相加得到
一,问题描述 给定一个整数N,求解该整数最少能用多少个Fib数字相加得到 Fib数列,就是如: 1,1,2,3,5,8,13.... Fib数列,满足条件:Fib(n)=Fib(n-1)+Fib(n- ...
- for循环练习题(1 ,判断任意一个数是91的多少倍 2,编写程序实现给定一个整数判断它从0到这个整数中间出现多少次9的次数)
1 //判断任意一个数是9的多少倍 #include <stdio.h> #include <stdlib.h> int main() { printf("请输入任意 ...
- 2018.3.12 Leecode习题 给定一个整数数列,找出其中和为特定值的那两个数。
给定一个整数数列,找出其中和为特定值的那两个数. 你可以假设每个输入都只会有一种答案,同样的元素不能被重用. 示例: 给定 nums = [2, 7, 11, 15], target = 9; 因为 ...
- 作业帮:给定一个整数数组,找出其中两个数相加等于目标值(去重set)
题目描述 给定一个整数数组,找出其中两个数相加等于目标值 输入 [1,3,5,7,9,11] 10 输出 1,9 3,7 代码: import java.util.HashMap; import ja ...
- 刷题之给定一个整数数组 nums 和一个目标值 taget,请你在该数组中找出和为目标值的那 两个 整数
今天下午,看了一会github,想刷个题呢,就翻出来了刷点题提高自己的实际中的解决问题的能力,在面试的过程中,我们发现,其实很多时候,面试官 给我们的题,其实也是有一定的随机性的,所以我们要多刷更多的 ...
- 给定一个整数数组 nums 和一个目标值 target,求nums和为target的两个数的下表
这个是来自力扣上的一道c++算法题目: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案 ...
- JAVA 之 每日一记 之 算法( 给定一个正整数,返回它在 Excel 表中相对应的列名称。 )
题目: 给定一个正整数,返回它在 Excel 表中相对应的列名称. 例如: 1 -> A 2 -> B 3 -> C ... 26 -> Z 27 -> AA 28 -& ...
- 算法:Manacher,给定一个字符串str,返回str中最长回文子串的长度。
[题目] 给定一个字符串str,返回str中最长回文子串的长度 [举例] str="123", 1 str="abc1234321ab" 7 [暴力破解] 从左 ...
随机推荐
- k8sdeploy配置文件示例
apiVersion: extensions/v1beta1 kind: Deployment metadata: name: [k8s服务名] namespace: default labels: ...
- 统一返回对象Result
统一返回对象Result 项目中我们会将响应封装成json返回,一般我们会将所有接口的数据格式统一, 使前端(iOS Android, Web)对数据的操作更一致.轻松. 一般情况下,统一返回数据格式 ...
- Hive中的高级函数
高级函数 1.炸裂函数 UDTF 通常是将数组或者集合中或者结构体(涉及到数据类型-------复杂数据类型)中的元素单个输出 特点:接收一行数据,输出一行或多行数据 2.窗口函数/开窗函数 概念:能 ...
- Python学习笔记--文件的相关操作
文件的读取操作 读操作 实现: read()--读完 read(10)--读取10个字节 readline()--将所有行并到一行输出 readlines()--一次读取一行 文件的关闭: 实现: 上 ...
- 2019徐州网络赛 M Longest subsequence 序列自动机
题目链接https://nanti.jisuanke.com/t/41395 题意:给两个字符串,s和t,在s中求字典序严格大于t的最长子序列. 思路:分类讨论即可.先建个s的序列自动机. 1 如果有 ...
- Typora怎么插入行内公式?内联公式设置
文件 偏好设置 把内联公式那个勾上就可以了.然后就能写latex了,像这样,$\alpha\$ \(\alpha\) 输入一个\$后再按esc,会自动补全为$$
- 在echaerts中渲染50万条数据的优化方案
背景:项目需求中要在页面上渲染大约50万条左右的波形数据图表 那么如何解决渲染中的卡顿呢? 肯定是要从服务端和前端一起优化这是毋庸置疑的. 1.服务端: 服务端耗时最多的一定是在数据库的筛选数据的行为 ...
- 如何使用 vue + intro 实现后台管理系统的引导
引言 为了让用户更好的适应新版,或更方便使用公司内部系统,可以加入新手指引功能.如果你也想在自己的网页加入用户指引,那就试试在 vue 中使用 Intro.js 吧,它能够很轻松的制作出新手指引的效果 ...
- 如何用浏览器读取本地文件(兼容IE8),new bing能帮我吗?
浏览器读写文件? 有一份老旧而精巧的代码(2006或更早),带js的html,可以只用浏览器来处理一些二进制存档数据. 文件的读写怎么办?通过变动的方法来完成. 利用十六进制编辑软件如WinHEX,直 ...
- PyQt5学习 (4)--QAbstractButton(下)
QAbstractBUtton: 所有按钮控件的基类 提供按钮的通用功能 继承自QWidget 属于抽象类别,不能直接去使用,必须借助于子类(除非你觉得子类不够用,想自定义一个按钮) ...