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

news2024/10/5 22:22:10

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 和 rightt
            dfs(i + 1, col | (1 << j), leftt | (1 << (i - j + n)), rightt | (1 << (i + j)));
        }
    }
}

// 解决问题的函数
void solve() {
    col = leftt = rightt = 0; // 初始化 col, leftt 和 rightt
    dfs(1, col, leftt, rightt); // 调用 dfs 函数从第 1 行开始
    cout << ret << endl; // 输出结果
}

signed main() {
    Fast(); // 快速输入输出
    
    cin >> n; // 输入 n
    solve(); // 调用 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); // 取出最低位的 1
        temp^=lowbit; // 将最低位的 1 置为 0
        if(i==n){ // 如果已经到最后一行
            ret++; // 计数增加
            continue; // 继续下一步
        }
        // 递归调用下一行,更新 col, leftt 和 rightt
        dfs(i+1,col|lowbit,(leftt|lowbit)<<1,(rightt|lowbit)>>1);
    }
    
}

// 解决问题的函数
void solve(){
    ret=0; // 初始化 ret
    col=leftt=rightt=0; // 初始化 col, leftt 和 rightt
    aim=(1<<n)-1; // 初始化 aim,将前 n 位设为 1
    dfs(1,col,leftt,rightt); // 调用 dfs 函数从第 1 行开始
    cout<<ret<<endl; // 输出结果
}

signed main(){
    Fast(); // 快速输入输出
    
    cin>>n; // 输入 n
    solve(); // 调用 solve 函数
    
}

结尾

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

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

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

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

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

相关文章

K8s Pod的QoS类

文章目录 OverviewPod的QoS分类Guaranteed1.如何将 Pod 设置为保证Guaranteed2. Kubernetes 调度器如何管理Guaranteed类的Pod Burstable1. 如何将 Pod 设置为Burstable2.b. Kubernetes 调度程序如何管理 Burstable Pod BestEffort1. 如何将 Pod 设置为 BestEffort2. Kubernete…

Docker 进入指定容器内部(以Mysql为例)

文章目录 一、启动容器二、查看容器是否启动三、进入容器内部 一、启动容器 这个就不多说了 直接docker run… 二、查看容器是否启动 查看正在运行的容器 docker ps查看所有的容器 docker ps -a结果如下图所示&#xff1a; 三、进入容器内部 通过CONTAINER ID进入到容器…

x86国产化麒麟系统上安装docker及问题解决

以前感觉安装docker没有问题&#xff0c;所以没有记录怎么安装的&#xff0c;最近在国产化系统上安装docker总是失败&#xff0c;经过仔细研究完全解决了该问题&#xff0c;特此记录。 参考链接&#xff1a; 在 OpenKylin 上安装 Docker 按照上面的链接可以知道整个docker安装…

足球俱乐部管理系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;教练管理&#xff0c;用户管理&#xff0c;合同信息管理&#xff0c;赛事管理 前台账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;公告信息&#xff0c;赛事…

在k8s中部署Kafka高可用集群超详细讲解

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《数据流专家&#xff1a;Kafka探索》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、Kafka简介 2、为什么在Kubernetes中部署Kafka 二、…

Facebook的隐私保护挑战:用户数据安全的新时代

在全球范围内&#xff0c;Facebook已经成为了不可忽视的社交媒体巨头&#xff0c;它连接着超过20亿的活跃用户。然而&#xff0c;随着其影响力的不断扩大&#xff0c;关于用户隐私和数据安全的问题也愈加引人关注。本文将深入探讨Facebook面临的隐私保护挑战&#xff0c;以及它…

列存在 OceanBase 数据库架构中的应用与演进

OceanBase 4.3 版本上线了列存功能&#xff0c;以满足实时分析的需求。 本文作为《特性解读&#xff1a;列存技术》的后续&#xff0c;将详细阐述列存技术在OceanBase数据库架构中的应用、发展历程&#xff0c;以及未来的趋势。 一、前言 1970 年&#xff0c;关系模型之父 Co…

275 基于matlab的脉搏信号处理GUI界面编程

基于matlab的脉搏信号处理GUI界面编程&#xff0c;并实现滤波、去噪、实时回放、小波分析 计算脉率。采用低通滤波器&#xff0c;计算巴特沃斯数字滤波器的阶数N和截止频率Wn、使用coif4小波基计算信号的平稳小波分解完成降噪。程序已调通&#xff0c;可直接运行。 275 脉搏信号…

Ubuntu22.04之安装有道词典(二百三十六)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

SQL158 每类视频近一个月的转发量/率

描述 用户-视频互动表tb_user_video_log iduidvideo_idstart_timeend_timeif_followif_likeif_retweetcomment_id110120012021-10-01 10:00:002021-10-01 10:00:20011NULL210220012021-10-01 10:00:002021-10-01 10:00:15001NULL310320012021-10-01 11:00:502021-10-01 11:01…

【golang学习之旅】Go中的cron定时任务

系列文章 【golang学习之旅】报错&#xff1a;a declared but not used 【golang学习之旅】Go 的基本数据类型 【golang学习之旅】深入理解字符串string数据类型 【golang学习之旅】go mod tidy 【golang学习之旅】记录一次 panic case : reflect: reflect.Value.SetInt using…

微处理器体系结构

1.冯诺依曼结构 传统计算机采用冯●诺依曼(Von Neumann)结构&#xff0c;也称普林斯顿结构&#xff0c;是一种将程序指令存储器和数据存储器合并在一起的存储器结构。 特征&#xff1a; 冯●诺依曼结构的计算机程序和数据共用一个存储空间&#xff0c;程序指令存储地址和数据…

SAP IQ03 Error IW351

今天在系统内碰到一个情况是IQ03 无法显示设备对象 报错为&#xff1a;IW 351 Equipment object status errors BS001 IW351 查阅资料后&#xff0c;note 1835087 提供了解决办法 1.SE38-->RISTEQ03 2.输入设备号&#xff0c;测试执行&#xff0c;确认无误后&#xff0…

8990890

作者主页&#xff1a;作者主页 数据结构专栏&#xff1a;数据结构 创作时间 &#xff1a;2024年5月18日

基于百度接口的实时流式语音识别系统

目录 基于百度接口的实时流式语音识别系统 1. 简介 2. 需求分析 3. 系统架构 4. 模块设计 4.1 音频输入模块 4.2 WebSocket通信模块 4.3 音频处理模块 4.4 结果处理模块 5. 接口设计 5.1 WebSocket接口 5.2 音频输入接口 6. 流程图 程序说明文档 1. 安装依赖 2.…

重邮803计网概述

目录 一.计算机网络向用户提供的最重要的功能 二.互联网概述 1.网络的网络 2.计算机网络的概念 3. 互联网发展的三个阶段 4.制订互联网的正式标准要经过以下的四个阶段 5.互联网的组成&#xff08;功能&#xff09; 6.互联网功能 7.互联网的组成&#xff08;物理&#…

13_前端工程化_ES6

1.前端工程化概念 前端工程化是使用软件工程的方法来单独解决前端的开发流程中模块化、组件化、规范化、自动化的问题,其主要目的为了提高效率和降低成本。 前后端分离&#xff08;前端代码工程化独立出来形成一个单独的app&#xff09; 1.开发分离 2.部署分离 3.服务器分离…

图片和PDF展示预览、并支持下载

需求 展示图片和PDF类型&#xff0c;并且点击图片或者PDF可以预览 第一步&#xff1a;遍历所有的图片和PDF列表 <div v-for"(data,index) in parerFont(item.fileInfo)" :key"index" class"data-list-item"><downloadCard :file-inf…

STM32HAL-最简单的长、短、多击按键框架

目录 概述 一、开发环境 二、STM32CubeMx配置 三、编码 四、运行结果 五、总结 概述 本文章使用最简单的写法实现长、短、多击按键框架&#xff0c;非常适合移植各类型单片机&#xff0c;特别是资源少的芯片上。接下来将在stm32单片机上实现&#xff0c;只需占用1个定时…

spring 启动顺序

BeanFactoryAware 可在Bean 中获取 BeanFactory 实例 ApplicationContextAware 可在Bean 中获取 ApplicationContext 实例 BeanNameAware 可以在Bean中得到它在IOC容器中的Bean的实例的名字。 ApplicationListener 可监听 ContextRefreshedEvent等。 CommandLineRunner 整…