福哥答案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. Golang 实现 RTP

    在 Coding 之前我们先来简单介绍一下 RTP(Real-time Transport Protocol), 正如它的名字所说,用于互联网的实时传输协议,通过 IP 网络传输音频和视频的网络协议. ...

  2. openfoam并行通信探索(一)

    前言 最近在忙,快一两周没更新了,今天说下如何实现openfoam内的并行通信 为什么要并行通信 说到并行通信大家不要害怕啊,只是不同核之间数据传递,比如说咱们仿真开16个核,3号计算单元对4号计算单 ...

  3. ASP.NET Core - 选项系统之选项使用

    上一篇 ASP.NET Core - 选项系统之选项配置 中提到 IOptions.IOptionsMonitor 和 IOptionsSnapshot 三个接口,通过这三个接口都可以从依赖注入容器中 ...

  4. 剑指 offer 第 24 天

    第 24 天 数学(中等) 剑指 Offer 14- I. 剪绳子 给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m.n都是整数,n>1并且m>1),每段绳子的长度记为 k[ ...

  5. Go 语言 new 和 make 关键字的区别

    原文链接: Go 语言 new 和 make 关键字的区别 本篇文章来介绍一道非常常见的面试题,到底有多常见呢?可能很多面试的开场白就是由此开始的.那就是 new 和 make 这两个内置函数的区别. ...

  6. Spring竟然可以创建“重复”名称的bean?—一次项目中存在多个bean名称重复问题的排查

    作者:京东科技 韩国凯 一.项目中存在了名称重复的bean 众所周知,在Spring中时不能够创建两个名称相同的bean的,否则会在启动时报错: 但是我却在我们的spring项目中发现了两个相同名称的 ...

  7. Mac基本命令操作

    Mac使用常见命令 删除空目录:rmdir 目录 删除文件夹:rm -rf 文件夹 创建一个文件夹:mkdir 文件名 创建一个文件:touch 文件 修改一个文件:vi 文件名 重命名文件 mv 原 ...

  8. redis 5种数据类型的增删改查

    string: 增:set name zhangsan 删:del name 改:set name lisi 查:get name hash: 增:hmset name name1 zhangsan ...

  9. GaussDB(DWS)网络调度与隔离管控能力

    摘要:调度算法是调度器的核心,设计调度算法要充分考虑业务场景和用户需求,没有万能的调度算法,只有合适的调度算法. 本文分享自华为云社区<GaussDB(DWS)网络调度与隔离管控能力>,作 ...

  10. [IDE]IDEA build artifacts过程很慢的解决方案[转载]

    解决方案 可能1 可能是缓存的文件太多了导致: File->Invalidate Caches /Restart,清理缓存, 并重启IDEA.重启之后,会重建索引, 此过程较慢, 但build的 ...