【一百】【算法分析与设计】N皇后问题常规解法+位运算解法

N皇后问题

链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网

题目描述

给出一个n×nn\times nn×n的国际象棋棋盘,你需要在棋盘中摆放nnn个皇后,使得任意两个皇后之间不能互相攻击。具体来说,不能存在两个皇后位于同一行、同一列,或者同一对角线。请问共有多少种摆放方式满足条件。

输入描述:

一行,一个整数n(1≤n≤12)n(1\le n \le 12)n(1≤n≤12),表示棋盘的大小。

输出描述:

输出一行一个整数,表示总共有多少种摆放皇后的方案,使得它们两两不能互相攻击。

示例1

输入

复制4

4

输出

复制2

2

常规解法

 
#include<bits/stdc++.h>
using namespace std;#define int long long
#define endl '\n'
#define Fast() ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);#define p pair<int,int>
#define ff first
#define ss second 
#define pb push_back
#define ppb pop_back#define ltu(i,a,b) for(int i=a;i<=b;i++) // 定义从a到b的循环
#define utl(i,a,b) for(int i=a;i>=b;i--) // 定义从a到b的倒序循环
#define tests() int t;cin>>t;while(t--) // 读取测试次数并循环int n; // 棋盘的大小
int ret=0; // 解的数量
vector<bool> visited1; // 列的标记数组
vector<bool> visited2; // 左下到右上的斜线标记数组
vector<bool> visited3; // 右下到左上的斜线标记数组void dfs(int i){ // 深度优先搜索函数,i表示当前行ltu(j,1,n){ // 遍历第i行的每一列if(!visited1[j]&&!visited2[j-i+n]&&!visited3[j+i]){ // 如果第j列和两条斜线都没有被占用if(i==n){ // 如果已经放到最后一行ret++; // 解的数量加一continue; // 继续下一次循环}visited1[j]=visited2[j-i+n]=visited3[j+i]=true; // 标记当前列和斜线dfs(i+1); // 递归调用下一行visited1[j]=visited2[j-i+n]=visited3[j+i]=false; // 回溯,取消标记}}
}void solve(){ // 解决函数ret=0; // 重置解的数量visited1.assign(n+1,0); // 初始化列标记数组visited2.assign(2*n+1,0); // 初始化左下到右上的斜线标记数组visited3.assign(2*n+1,0); // 初始化右下到左上的斜线标记数组dfs(1); // 从第一行开始搜索cout<<ret<<endl; // 输出解的数量
}signed main(){ // 主函数Fast(); // 加速输入输出cin>>n; // 读取棋盘大小solve(); // 调用解决函数
}

位运算解法1

 
#include<bits/stdc++.h>
using namespace std;#define int long long // 定义 int 为 long long 类型
#define endl '\n' // 定义 endl 为换行符
#define Fast() ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); // 快速输入输出#define p pair<int,int> // 定义 p 为一对整数
#define ff first // 定义 ff 为 first
#define ss second // 定义 ss 为 second #define ltu(i,a,b) for(int i=a;i<=b;i++) // 定义从 a 到 b 的递增循环
#define utl(i,a,b) for(int i=a;i>=b;i--) // 定义从 a 到 b 的递减循环
#define tests() int t;cin>>t;while(t--) // 定义测试次数循环int n; // 定义 n
int ret=0; // 定义 ret 并初始化为 0
int col, leftt, rightt; // 定义 col, leftt, rightt 记录有皇后的位置// 深度优先搜索函数
void dfs(int i, int col, int leftt, int rightt) {if (i == n + 1) { // 如果已经放置完所有皇后ret++; // 计数增加return; // 返回上一层}// 从第 0 列到第 n-1 列尝试放置皇后ltu(j, 0, n-1) {// 检查第 j 列,左斜和右斜是否被攻击bool temp = (col & (1 << j)) | (leftt & (1 << (i - j + n))) | (rightt & (1 << (i + j)));if (!temp) { // 如果当前位置没有被攻击// 递归调用下一行,更新 col, leftt 和 righttdfs(i + 1, col | (1 << j), leftt | (1 << (i - j + n)), rightt | (1 << (i + j)));}}
}// 解决问题的函数
void solve() {col = leftt = rightt = 0; // 初始化 col, leftt 和 righttdfs(1, col, leftt, rightt); // 调用 dfs 函数从第 1 行开始cout << ret << endl; // 输出结果
}signed main() {Fast(); // 快速输入输出cin >> n; // 输入 nsolve(); // 调用 solve 函数
}

位运算解法2

 
#include<bits/stdc++.h>
using namespace std;#define int long long // 定义 int 为 long long 类型
#define endl '\n' // 定义 endl 为换行符
#define Fast() ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); // 快速输入输出#define p pair<int,int> // 定义 p 为一对整数
#define ff first // 定义 ff 为 first
#define ss second // 定义 ss 为 second
#define pb push_back // 定义 pb 为 push_back
#define ppb pop_back // 定义 ppb 为 pop_back#define ltu(i,a,b) for(int i=a;i<=b;i++) // 定义从 a 到 b 的递增循环
#define utl(i,a,b) for(int i=a;i>=b;i--) // 定义从 a 到 b 的递减循环
#define tests() int t;cin>>t;while(t--) // 定义测试次数循环int n; // 定义 n
int ret=0; // 定义 ret 并初始化为 0
int col,leftt,rightt; // 定义 col, leftt, rightt 记录有皇后的位置
int aim=0; // 定义 aim 并初始化为 0// 深度优先搜索函数
void dfs(int i,int col,int leftt,int rightt){int temp=col|leftt|rightt; // 计算当前所有被攻击的位置temp=~temp; // 取反得到可以放置皇后的位置temp&=aim; // 只保留有效位// 当 temp 不为 0 时while(temp){int lowbit=temp&(-temp); // 取出最低位的 1temp^=lowbit; // 将最低位的 1 置为 0if(i==n){ // 如果已经到最后一行ret++; // 计数增加continue; // 继续下一步}// 递归调用下一行,更新 col, leftt 和 righttdfs(i+1,col|lowbit,(leftt|lowbit)<<1,(rightt|lowbit)>>1);}}// 解决问题的函数
void solve(){ret=0; // 初始化 retcol=leftt=rightt=0; // 初始化 col, leftt 和 righttaim=(1<<n)-1; // 初始化 aim,将前 n 位设为 1dfs(1,col,leftt,rightt); // 调用 dfs 函数从第 1 行开始cout<<ret<<endl; // 输出结果
}signed main(){Fast(); // 快速输入输出cin>>n; // 输入 nsolve(); // 调用 solve 函数}

结尾

最后,感谢您阅读我的文章,希望这些内容能够对您有所启发和帮助。如果您有任何问题或想要分享您的观点,请随时在评论区留言。

同时,不要忘记订阅我的博客以获取更多有趣的内容。在未来的文章中,我将继续探讨这个话题的不同方面,为您呈现更多深度和见解。

谢谢您的支持,期待与您在下一篇文章中再次相遇!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/20124.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自用了很久的一款强制卸载软件,超级好用!!!

Ashampoo UnInstaller是一款由Ashampoo公司开发的专业卸载工具&#xff0c;它提供了比Windows自带卸载功能更为彻底的程序卸载解决方案。是一款功能强大的卸载工具&#xff0c;旨在帮助用户彻底删除不需要的程序和应用&#xff0c;卸载难以卸载的软件工具&#xff0c;此外他还有…

面试杂谈k8s

其实看我之前的博客&#xff0c;k8s刚有点苗头的时候我就研究过&#xff0c;然后工作的时候间接接触 也自己玩过 但是用的不多就忘记了&#xff0c;正苦于不知道写什么&#xff0c;水一篇 用来面试应该是够了 支持云应用开发、运行与运维一体化的云应用平台软件应运而生 k8s核…

三、框架基础介绍:关于框架基础结构的创建与功能解析

在最近的项目开发中&#xff0c;我们进行了精心的组件结构搭建。 首先&#xff0c;在 src 目录下创建了 components 文件夹&#xff0c;随后在其中创建了 index-basis目录。 在下面创建以下文件 ——index.vue 主组件 ——theme.scss 主题 ——Layout 布局 —— —— rou…

供应商平台基本功能

1.合同管理 合同基本功能 1.1 列表页 搜索&#xff1a;合同编号 列表&#xff1a;合同列表页 查看&#xff1a;跳转到详情页 合计&#xff1a;确认当前页合计&#xff0c;还是所有合同合计。 1.1.2 详情页 点击合同列表页查看跳转至合同详情 1.2合同执行情况 合同具体执行情况&…

智慧车站管理:提升地铁站新质生产力的策略

应用图扑自研产品 HT for Web 结合 BIM 技术&#xff0c;搭建轻量化的 WebGIS 智慧车站系统。 该系统通过整合轨道交通信息&#xff0c;实现了车站数据的多维互联与融合。提升了车站信息管理效率和运营效能&#xff0c;并优化了乘客出行体验。对构建智能、高效、环保的轨道交通…

使用C#实现VS窗体应用——画图板

✅作者简介&#xff1a;大家好&#xff0c;我是 Meteors., 向往着更加简洁高效的代码写法与编程方式&#xff0c;持续分享Java技术内容。&#x1f34e;个人主页&#xff1a;Meteors.的博客&#x1f49e;当前专栏&#xff1a;小项目✨特色专栏&#xff1a; 知识分享&#x1f96d…

前端树形结构组件的设计与实现:以企查查、天眼查股权结构为例

摘要 随着信息化时代的不断发展&#xff0c;数据可视化在各行各业的应用越来越广泛。特别是在商业信息查询领域&#xff0c;如企查查、天眼查等平台&#xff0c;通过直观的数据展示方式&#xff0c;帮助用户快速理解复杂的商业关系。本文将以一个前端tree树形结构模版组件为例…

【算法】模拟算法——替换所有的问号(easy)

题解&#xff1a;替换所有的问好(模拟算法) 目录 1.题目2.题解3.参考代码4.总结 1.题目 题目链接&#xff1a;LINK 2.题解 纯模拟。从前往后遍历整个字符串&#xff0c;找到问号之后&#xff0c;就⽤ a ~ z 的每⼀个字符去尝试替换即可。 3.参考代码 class Solution { pu…

EVO轨迹评估工具基本使用教程(学习记录)

参考文章链接&#xff1a; slam轨迹评估性能指标汇总 EVO安装使用教程 各类数据格式 slam精度评定工具 轨迹评估工具使用&#xff1a;evo安装以及学习 EVO学习记录 评估slam输出轨迹精度的工具&#xff0c;自动生成均值、方差、轨迹等信息的图或表。 支持数据集&#x…

使用docker部署项目

一、docker私有镜像仓库 1、docker私有镜像仓库 库&#xff08;Repository&#xff09;是集中存放镜像的地方&#xff0c;又分为公共镜像和私有仓库。 当我们执行docker pull xxx的时候&#xff0c;它实际上是从registry.docker.com这个地址去查找&#xff0c;这就是Docker公…

城市之旅:使用 LLM 和 Elasticsearch 简化地理空间搜索(二)

我们在之前的文章 “城市之旅&#xff1a;使用 LLM 和 Elasticsearch 简化地理空间搜索&#xff08;一&#xff09;”&#xff0c;在今天的练习中&#xff0c;我将使用本地部署来做那里面的 Jupyter notebook。 安装 Elasticsearch 及 Kibana 如果你还没有安装好自己的 Elasti…

EitbaseEX香港业务开展,提升用户友好交易体验

在全球范围内备受瞩目的加密货币交易平台Coinbase&#xff0c;宣布正式入驻香港市场&#xff0c;并命名为EitbaseEX。这一战略性扩展举措&#xff0c;旨在为香港提供先进的加密货币交易技术和服务&#xff0c;同时将香港打造为其在亚太地区的重要枢纽。 作为国际金融中心&#…

Nginx 文件下载 限速设置 限制访问频率 下载速率 并发连接数 简单实用教程

1 没有限速之前 2 nginx配置 #增加如下配置 limit_conn_zone $binary_remote_addr zoneaddr:10m; location / {limit_conn addr 1; #按照来源&#xff0c;限制每个IP 的连接数为1limit_rate_after 1000k;不限速下载的数据量limit_rate 100k; #限制最大传输速率root /data/log…

sudo命令的隐患-要注意安全使用!!严格管理!!严格控制

前言 众所周知&#xff0c;sudo命令非常方便&#xff0c;而且有一定的优点。比如不需要知道root密码就可以执行一些root的命令。相比于su 必须知道root密码来说&#xff0c;减少了root密码泄露的风险。 但是sudo也是一把非常锋利的双刃剑&#xff0c;需要加以限制&#xff0c;…

网络安全等级保护相关标准及发展

目录 等保标准 等保定级 发展 等保标准 《网络安全法》第二十一条提出“国家实行网络安全等级保护制度”。 等级保护标准体系&#xff1a; &#xff08;1&#xff09;安全等级类标准 主要包括GB/T 22240-2008《信息安全技术 信息系统安全保护等级保护定级指南》 和 各类…

找出缺失和重复的数字 - (LeetCode)

前言 最近工作太忙了&#xff0c;周一到周五&#xff0c;画了5天的原型设计&#xff0c;看着原型设计我都准备要吐的节奏&#xff0c;新项目很多业务不熟悉&#xff0c;去问同事需求&#xff0c;网上找资料学习业务需求&#xff0c;更重要的是还要构思业务流程和界面展示&…

amis源码 onEvent事件动作 和 Action行为按钮解析

Action行为按钮组件 &#xff08;仅支持click事件&#xff09; Action行为按钮是针对click点击事件的一些处理。actionType指定action作用类型&#xff1a;ajax、link、url、drawer、dialog、confirm、cancel、prev、next、copy、close amis配置&#xff1a;{ "type&quo…

翻译《The Old New Thing》- What a drag: Dragging a virtual file (IStream edition)

What a drag: Dragging a virtual file (IStream edition) - The Old New Thing (microsoft.com)https://devblogs.microsoft.com/oldnewthing/20080319-00/?p23073 Raymond Chen 2008年03月19日 拖拽虚拟文件&#xff08;IStream 版本&#xff09; 上一次&#xff0c;我们看…

python | 类的实现

和实例有关的&#xff0c;通过对象名&#xff0c;打点调用 实例属性&#xff0c;实例方法 stuStudent("XiaoMing",18) print(stu.name) 类属性、静态方法和类方法都是通过类名直接调用 Student.name 静态方法和类方法都不能调用实例属性和实例方法 动态绑定 如果是函…

稳定性问题ANR-input

专栏简介 接上文【Android ANR简介】内容,深入探索input 类型的ANR问题产生原理,至于解决此类ANR的进阶内容会在下篇【稳定性问题ANR-input进阶】中详细介绍。 input ANR简介 Android app的input事件都是有主线程消费的,假设主线程有耗时函数执行,就会产生ANR问题;但是…