当前位置: 首页 > news >正文

20-dfs-N皇后问题(中等)

题目

来源

843. n-皇后问题 - AcWing题库

思路

引自:AcWing 843. n-皇后问题--图解+代码注释 - AcWing

核心思路:深度优先遍历

函数名:void dfs(int r): 深度优先遍历函数。参数r:从第r行开始放棋子,处理第r行。

递归结束判定:见代码,当 r == n的时候,说明应该处理第 n行了,也代表第 0~n-1行放好棋子,也就是整个棋盘放好了棋子,也就是得到了一种解,也就是递归结束。

第r行,第i列能不能放棋子:用数组dg udg cor 分别表示:点对应的两个斜线以及列上是否有皇后。
dg[i + r] 表示 r行i列处,所在的对角线上有没有棋子,udg[n - i + r]表示 r行i列处,所在的反对角线上有没有棋子,cor[i]表示第i列上有没有棋子。如果 r行i列的对角线,反对角线上都没有棋子,即!cor[i] && !dg[i + r] && !udg[n - i + r]为真,则代表 r行i列处可以放棋子。


 n - i + r和i + r其实就是一个小trick,b=y-x或者b=y+x;+n是为了防止出现负数越界

代码

#include<bits/stdc++.h>
using namespace std;
const int N=20;
char dg[N],udg[N],col[N];
char q[N][N];
// int r; //表示每行,一行一行去处理
int n;
void dfs(int r){
    if(r==n){
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                cout<<q[i][j];
            }
            cout<<endl;            
        }
        cout<<endl;
        return;
    }
    for(int i=0;i<n;i++){
        if(!col[i]&& !dg[i+r] && !udg[n-i+r]){
            q[r][i]='Q';
            col[i]=dg[i+r]=udg[n-i+r]=1;
            dfs(r+1);
            col[i]=dg[i+r]=udg[n-i+r]=0;
            q[r][i]='.'; //这里也是要恢复现场的
        }
    }
    
}
int main(){
    cin>>n;
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            q[i][j]='.';
        }
    }
    dfs(0);
    return 0;
}

相关文章:

  • TCP三次握手,四次挥手,再次总结
  • ubuntu22安装tenserflow0.12.1
  • Java 数据库连接池
  • Mybatis_Plus中的条件构造器和常用接口,插件
  • 【算法手记8】NC95 数组中的最长连续子序列 字母收集
  • AI 只能聊天、生成图片、生成视频吗?
  • 封装了一个iOS多分区自适应宽度layout
  • SQL生成ER图/AI生成ER图,智能生成ER图/在线快速编写ER图
  • 全局安装 Entity Framework Core (EF Core)
  • Redis持久化
  • 当 Windows 10 的 C 盘快满时,可以通过以下方法来释放空间
  • Redis-04.Redis常用命令-字符串常用命令
  • 什么是虚拟机?它们如何工作?
  • Webpack vs Vite:深度对比与实战示例,如何选择最佳构建工具?
  • 知能行综测
  • 算法基础
  • 人工智能:从科幻想象到社会重构的技术革命
  • JAVA反序列化深入学习(十):CommonsBeanutils1
  • 电器维修|基于Java+vue的电器维修系统(源码+数据库+文档)
  • 【踩坑】Mac mini m4 安装 jdk8 失败
  • 东营企业网站seo/网络营销名词解释答案
  • 一个人做网站难吗/实时热榜
  • 曲阳网站建设在哪/网站友情链接交易平台
  • 国外一个做ppt的网站/seo关键词优化费用
  • 建设企业网站心得体会/江苏网站建站系统哪家好
  • 深圳建设银行网站首页/新媒体运营培训学校