首页 > 其他分享 >n皇后问题(DFS)

n皇后问题(DFS)

时间:2024-03-30 21:00:36浏览次数:21  
标签:输出 .. ... int DFS 问题 对角线 皇后

n皇后问题是指将 n 个皇后放在 n×n 的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行、同一列或同一斜线上。

1_597ec77c49-8-queens.png

现在给定整数 n,请你输出所有的满足条件的棋子摆法。

输入格式

共一行,包含整数 n。

输出格式

每个解决方案占 n 行,每行输出一个长度为 n 的字符串,用来表示完整的棋盘状态。

其中 . 表示某一个位置的方格状态为空,Q 表示某一个位置的方格上摆着皇后。

每个方案输出完成后,输出一个空行。

注意:行末不能有多余空格。

输出方案的顺序任意,只要不重复且没有遗漏即可。

数据范围

1≤n≤9

输入样例:
4
输出样例:
.Q..
...Q
Q...
..Q.

..Q.
Q...
...Q
.Q..

 解题思路因为每一行只能放一个皇后,所以我们对每一行进行深搜。这里对每一列、正对角线和反对角线都要进行标记,以便回溯。对角线设置也很重要,详细见代码。

#include<iostream>
using namespace std;
const int N=20; 
char g[N][N];
int n;
bool l[N],dg[N],udg[N]; //列,正对角线、反对角线标记数组
void dfs(int u)
{
    if(u==n)
    {
        for(int i=0;i<n;i++)
        {
            puts(g[i]); //用puts输出字符串方便
        }
        cout<<endl;
        return; //结束第一种深搜
    }
    for(int i=0;i<n;i++)
    {
        if(!l[i]&&!dg[u+i]&&!udg[u-i+n]) //表示没被标记
        {
            g[u][i]='Q';
            l[i]=dg[u+i]=udg[u-i+n]=true; //标记
            dfs(u+1); //下一行
            l[i]=dg[u+i]=udg[u-i+n]=false; //恢复现场
            g[u][i]='.';
        }
    }
}
int main()
{
    cin>>n;
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            g[i][j]='.';
        }
    }
    dfs(0);
    return 0;
}

标签:输出,..,...,int,DFS,问题,对角线,皇后
From: https://blog.csdn.net/2303_80209427/article/details/137151826

相关文章

  • 倍增LCA,ST表,DFS序
    DFS序一般与线段树等综合运用,就是将树转换为线段,存在线段树中点击查看代码voiddfs(intnow){ vis[now]=1; a[++dfscnt]=x/shuzu[x];//用途线段树if(l==r)st[rt].val=a[l] in[x]=dfscnt; for(inti=head[now];i;i=edge[i].next) { intto=edge[i].to; if(!vis[to]......
  • P8764 [蓝桥杯 2021 国 BC] 二进制问题
    原题链接题解1.如果数字为\(100110101\)那么答案为\(000000000\)~\(011111111\)中,k个1的组合数+\(100000000\)~\(100011111\)中k-1个1的组合数+...+\(1010101...\)(有k个1)中0个1的组合数,也就是1当遇见当遇见k个1后就可以退出了,最后判断数的1的个数够不够k,如果够......
  • pg的计算百分数的问题
    SELECTcast("dept_id"asvarchar(32)),cast("dept_name"asvarchar(30))AS"病区","total_surgical_patients"AS"手术总数","total_preop_medication_patients"AS"用药总数",......
  • Flink 反压问题处理
    在分布式流处理系统中,反压(Backpressure)是一个常见的问题,它发生在下游处理速度跟不上上游数据发送速度时。ApacheFlink是一个高性能的流处理框架,它提供了多种机制来处理反压问题。下面是一步步分析问题原因,给出案例,并提出解决方案的过程。###1.问题原因分析**上游发送速度......
  • 背包问题
    01背包01背包模型有一个容量为V的背包。商店有n个物品,每个物品有一个价值v与体积w,一个物品只能拿一次,问可以装下物品的最大价值。有两个状态,拿或者不拿,用搜索要2^n种。设状态dp[i][j]表示到第i个物品为止,拿的物品总体积为j的情况下的最大价值。我们不关心某个物品有没有被拿,只......
  • idea中文包不能正确加载的问题
    plugin"chinese(simplified)languagepack/中文语言包"wasnotinstalled:invalidfilenamereturnedbyaserver解决方案:打开链接:Chinese(Simplified)LanguagePack/中文语言包-IntelliJIDEsPlugin|Marketplace(jetbrains.com)查看IDEA相应的版本,并......
  • 每日一练 两数相加问题(leetcode)
    原题如下:这道题目是一道链表题,我们对于这种链表类,很显然我们最后输出的是初始节点,所以我们要保留我们的初始头指针,那么我们的第一步一定是把头指针保留一份,然后再让头指针往后进行操作。那么我们进行什么操作呢,很简单,就是把l1和l2的对应内容加起来就行了,那么我们就面临这样几......
  • qrcodejs2 首次生成微信支付二维码不渲染问题
    使用qrcodejs2生成微信支付二维码,后端向前端传递了微信二维码url,通过此方法生成渲染二维码图片  qrcode(url){ //前端根据URL生成微信支付二维码   console.log("调用二维码生成")   //先清除,后增加   document.getElementById("qrcodeIm......
  • 鱼塘钓鱼问题
    这题目给了三种做法,两种是动态规划做法,一种是贪心加枚举,还有一种是堆写法,这可以促进我对动态规划的理解,所以在此贴出四种板子,并且给出解释第一种做法,自下二上更新第二种做法,自上而下更新点击查看代码#include<bits/stdc++.h>usingnamespacestd;constintN=110;int......
  • 线程的安全问题
    目录导言:正文:1.共享资源:2.非原子操作:3.执行顺序不确定:4.可见性:5.死锁和饥饿:6.指令重排序:总结:导言:线程安全是并发编程中的一个重要概念,它指的是在多线程环境下,对共享数据的访问和修改不会导致数据的不一致或其他不可预料的结果。在Java中,线程安全问题通常涉及到共......