【LeetCode】52、N 皇后 II

embedded/2024/12/24 1:52:36/

【LeetCode】52、N 皇后 II

文章目录

  • 一、递归 数组解法
    • 1.1 递归 数组解法
    • 1.2 多语言解法
  • 二、位运算解法
    • 1.1 位运算解法
    • 2.2 多语言解法

一、递归 数组解法

1.1 递归 数组解法

// go
func totalNQueens(n int) int {return f(n, 0, make([]int, n))
}// 在 [0...i-1] 行已摆放的情况下 路径是 path, 返回: 第i行 有几种方案
// 其中 path 的下标为行, 值为列
func f(n, i int, path []int) (ans int) {if i == n {return 1} // 若能成功摆放到 [0...n-1], 则说明已得到一种解决方案for j := 0; j < n; j++ { // 当前若摆放在 第i行, 第j列if check(path, i, j) { // 第i行, 第j列 可以摆放path[i] = j // 放入路径ans += f(n, i+1, path) // 继续下一行, 直到到达最后一行} // 否则: 若不能摆放, 则不会进入下一行, 从而无法到达最后一行, 最终不能形成解决方案}return
}// 在 [0...i-1] 行已摆放且路径为 path 的情况下, 返回 第i行第j列能否摆放
func check(path []int, i, j int) bool {for k := 0; k < i; k++ { // 遍历第k行: 即从 第0到i-1行// 第k行, 对应的是 path[k] 列if j == path[k] || abs(i-k) == abs(j-path[k]) { // 列冲突, 或, 对角线冲突, 则无法摆放return false}}return true
}func abs(x int) int {if x < 0 {return -x}return x
}

参考左神 N皇后 数组解法

1.2 多语言解法

C p p / G o / P y t h o n / R u s t / J s / T s Cpp/Go/Python/Rust/Js/Ts Cpp/Go/Python/Rust/Js/Ts

// cpp
// go 同上
# python
// rust
// js
// ts

二、位运算解法

1.1 位运算解法

func totalNQueens(n int) int {if n < 1 {return 0}limit := (1<<n) - 1 // 最低位为n个1return f(limit, 0, 0, 0)
}// 第i行, col为列, left为向左下的对角线, right为向右下的对角线. 第x位为1表示第x位被占用了
// limit 则限制, 只处理 0 到 n 位内的数
func f(limit, col, left, right int) (ans int) {if col == limit {return 1} // 若 col 和 limit 相等, 说明之前 0...i-1 行已经把 各列 都填充了, 则说明找到了一个解决方案ban := col | left | right // 第i行的禁止区域candidate := limit & (^ban) // 第i行的可选区域, golang 中 ^ 就是表示 ~ 按位取反的意思for candidate != 0 { // 第i行, 尝试各种列的取值place := candidate & (-candidate) // candidate最右侧的1, 其中 -candidate 就是 ~candidate+1, 是放置皇后的尝试candidate ^= place // 移除candidate最右侧的1ans += f(limit, col | place, (left | place) >> 1, (right | place) << 1)}return
}

参考左神 位运算版本

2.2 多语言解法

C p p / G o / P y t h o n / R u s t / J s / T s Cpp/Go/Python/Rust/Js/Ts Cpp/Go/Python/Rust/Js/Ts

// cpp
// go 同上
# python
// rust
// js
// ts

http://www.ppmy.cn/embedded/148224.html

相关文章

nodejs:nodejs的技巧有哪些

Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行环境&#xff0c;它允许开发者构建高性能的网络应用。 1.使用 require 语句时&#xff0c;尽量使用绝对路径避免模块路径冲突。 例如&#xff1a; const _ require(/path/to/your/module); 2.使用 npm 时&#xff0c;可…

Centos创建共享文件夹拉取文件

1.打开VMware程序&#xff0c;鼠标右检你的虚拟机&#xff0c;打开设置 2.点击选项——共享文件夹——总是启用 点击添加&#xff0c;设置你想要共享的文件夹在pc上的路径&#xff08;我这里已经添加过了就不加了&#xff09; 注意不要中文&#xff0c;建议用share&#xff0c…

[计算机网络]唐僧的”通关文牒“NAT地址转换

1.NAT&#xff1a;唐僧的通关文牒 在古老的西游记中&#xff0c;唐僧师徒四人历经九九八十一难&#xff0c;终于取得了真经。然而&#xff0c;他们并不是一开始就获得了通关文牒&#xff0c;而是经过了重重考验&#xff0c;最终得到了国王的认可&#xff0c;才顺利通过了各个关…

贪心算法 part01

class Solution { public:int maxSubArray(vector<int>& nums) {int result INT32_MIN;int count 0;for (int i 0; i < nums.size(); i) {count nums[i];if (count > result) { // 取区间累计的最大值&#xff08;相当于不断确定最大子序终止位置&#xff…

36.3 grafana-dashboard看图分析

kube-prometheus中的grafana总结 db使用 sqlit&#xff0c;volume类型为emptydir 无法持久化&#xff0c;pod扩缩就重新创建通过configMap设置的prometheus DataSource 通过 prometheus-k8s svc对应的 域名访问下面对应两个prometheus容器&#xff0c;有HA 各个dashboard通过 …

CS 144 check4: interoperating in the world

Lectures Note 略 Exercises 执行cmake --build build --target check_webget发现超出12s了。 1、回看check0的代码&#xff0c;似乎不需要关闭写入方向&#xff0c;于是注释掉&#xff08;关键&#xff09; 2、将request的变量类型从string转为string_view&#xff08;顺手…

Ubuntu18.04——换源

一、前提说明 系统自带的源往往下载很慢&#xff0c;通过换源操作后&#xff0c;往往下载/更新 速度大幅提升 每种版本对应的不一样&#xff0c;例如Ubuntu18.04和Ubuntu20.04的有差异&#xff0c;所以换源需要根据不同版本对应的命令 二、操作步骤 0.备份原先的 /etc/apt/sou…

form表单校验对象中的对象的属性 / 根据表单中某一个数据动态添加其他项是否必填

<template> <el-form ref"form" :model"form" :rules"rules" label-width"120px"> <div class"info-tag">表单信息</div> <el-row :gutter"20"> <el-c…