福哥答案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皇后的摆法有多少种?的更多相关文章

  1. 给定一个整数N,找出一个比N大且最接近N,但二进制权值与该整数相同 的数

    1,问题描述 给定一个整数N,该整数的二进制权值定义如下:将该整数N转化成二进制表示法,其中 1 的个数即为它的二进制权值. 比如:十进制数1717 的二进制表示为:0000 0110 1011 01 ...

  2. LeetCode竞赛题:K 次取反后最大化的数组和(给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次。)

    给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次.(我们可以多次选择同一个索引 i.) 以这种方式修改数组后 ...

  3. 给定一个整数,求解该整数最少能用多少个Fib数字相加得到

    一,问题描述 给定一个整数N,求解该整数最少能用多少个Fib数字相加得到 Fib数列,就是如: 1,1,2,3,5,8,13.... Fib数列,满足条件:Fib(n)=Fib(n-1)+Fib(n- ...

  4. for循环练习题(1 ,判断任意一个数是91的多少倍 2,编写程序实现给定一个整数判断它从0到这个整数中间出现多少次9的次数)

    1 //判断任意一个数是9的多少倍 #include <stdio.h> #include <stdlib.h> int main() { printf("请输入任意 ...

  5. 2018.3.12 Leecode习题 给定一个整数数列,找出其中和为特定值的那两个数。

    给定一个整数数列,找出其中和为特定值的那两个数. 你可以假设每个输入都只会有一种答案,同样的元素不能被重用. 示例: 给定 nums = [2, 7, 11, 15], target = 9; 因为 ...

  6. 作业帮:给定一个整数数组,找出其中两个数相加等于目标值(去重set)

    题目描述 给定一个整数数组,找出其中两个数相加等于目标值 输入 [1,3,5,7,9,11] 10 输出 1,9 3,7 代码: import java.util.HashMap; import ja ...

  7. 刷题之给定一个整数数组 nums 和一个目标值 taget,请你在该数组中找出和为目标值的那 两个 整数

    今天下午,看了一会github,想刷个题呢,就翻出来了刷点题提高自己的实际中的解决问题的能力,在面试的过程中,我们发现,其实很多时候,面试官 给我们的题,其实也是有一定的随机性的,所以我们要多刷更多的 ...

  8. 给定一个整数数组 nums 和一个目标值 target,求nums和为target的两个数的下表

    这个是来自力扣上的一道c++算法题目: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案 ...

  9. JAVA 之 每日一记 之 算法( 给定一个正整数,返回它在 Excel 表中相对应的列名称。 )

    题目: 给定一个正整数,返回它在 Excel 表中相对应的列名称. 例如: 1 -> A 2 -> B 3 -> C ... 26 -> Z 27 -> AA 28 -& ...

  10. 算法:Manacher,给定一个字符串str,返回str中最长回文子串的长度。

    [题目] 给定一个字符串str,返回str中最长回文子串的长度 [举例] str="123", 1 str="abc1234321ab" 7 [暴力破解] 从左 ...

随机推荐

  1. 爬快手,graphql查询语言

    graphql查询语言:https://blog.csdn.net/qq_41882147/article/details/82966783 即:前端调用同一个接口传入不同的操作,得到不同的返回值 一 ...

  2. go 发布

    rm test-serv.bingo build -o test-serv.bin main.go

  3. 关于两行代码让我时间无限拉长这件事------mainServlet

    在再一次尝试实现增删改查的功能时,出现了一些BUG,修改功能一直实现不了,查了好久的资料,这才发现问题 如上图所示,这个Servlet里面定义的方法,虽然很短,但是重要的很奥,改了好久都没注意到这个问 ...

  4. 从零开始学习Java系列之Java运行机制与跨平台特性

    全文大约[4000]字,不说废话,只讲可以让你学到技术.明白原理的纯干货!并带有丰富的案例及配图,让你更好地理解和运用文中的技术概念,给你带来具有足够启迪的思考-- 在上一篇文章中,壹哥给大家介绍了J ...

  5. 华为Sound Joy用后感

    在买华为Sound Joy音响前,我就在几个相似的音响之中衡量,其中有MIFA WildRod和JBL 万花筒6做了对比,在经过一系列的对比(网上查阅资料)之后,我最终选择了华为的Sound Joy这 ...

  6. 网络----OSI七层

    OSI 订制的是一个用于计算机或通信系统间互联的标准体质(一般称为OSI参考模型或七层模型) OSI 模型把网络通信的工作分为7层分别是: 常用内容:物理层 数据链层 网络层 注解 OSI 7层 1. ...

  7. requests不带参数的get请求和带get参数请求

    requests库常用的方法 requests.Request(url) 构造一个请求,支持以下各种方式 requests.get() 发送get请求 requests.post() 发送post请求 ...

  8. Promise合集

    Promise.all Promise.all 可以将多个 Promise 实例包装成一个新的 Promise 实例.所有的 Promise 对象都成功时返回的是一个结果数组,一旦有任何一个 Prom ...

  9. 我没能实现始终在一个线程上运行 task

    前文我们总结了在使用常驻任务实现常驻线程时,应该注意的事项.但是我们最终没有提到如何在处理对于带有异步代码的办法.本篇将接受笔者对于该内容的总结. 如何识别当前代码跑在什么线程上 一切开始之前,我们先 ...

  10. pandas之聚合函数

    在<Python Pandas窗口函数>一节,我们重点介绍了窗口函数.我们知道,窗口函数可以与聚合函数一起使用,聚合函数指的是对一组数据求总和.最大值.最小值以及平均值的操作,本节重点讲解 ...