[C++][算法基础]n-皇后问题(DFS)

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

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

输入格式

共一行,包含整数 n。

输出格式

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

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

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

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

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

数据范围

1≤n≤9

输入样例:
复制代码
4
输出样例:
复制代码
.Q..
...Q
Q...
..Q.

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

代码:

cpp 复制代码
#include<iostream>
using namespace std;

const int N = 20;
char path[N][N];
int row[N],k[N],uk[N];
int n;

void dfs(int now){
    if(now == n){
        for(int p = 0;p<n;p++){
            for(int q = 0;q<n;q++){
                cout<<path[p][q];
            }
            cout<<endl;
        }
        cout<<endl;
    }else{
        for(int j = 0;j<n;j++){
            if(row[j] == 0 && k[j + now] == 0 && uk[n+j-now] == 0){
                row[j] = 1;
                k[j + now] = 1;
                uk[n+j-now] = 1;
                path[now][j] = 'Q';
                dfs(now+1);
                row[j] = 0;
                k[j + now] = 0;
                uk[n+j-now] = 0;
                path[now][j] = '.';
            }
        }
    }
}

int main(){
    cin>>n;
    for(int p = 0;p<n;p++){
        for(int q = 0;q<n;q++){
            path[p][q] = '.';
            
        }
        row[p] = 0;
        k[p] = 0;
        uk[p] = 0;
    }
    dfs(0);
    return 0;
}
相关推荐
释厄6232 分钟前
矢量词汇向下不向上公理即词汇归位定律——肤浅即表面
java·人工智能·算法·去中心化·1024程序员节
码小猿的CPP工坊5 分钟前
C++跨平台开发之基于wxWidgets开发GUI程序简介-002
开发语言·c++
海绵宝宝转agent8 分钟前
Leetcode100+面经
java·笔记·学习·算法·leetcode·深度优先
Shaoshing13 分钟前
LeetCode100 283.移动零
java·数据结构·算法·leetcode
海绵宝宝转agent14 分钟前
LeetCode100个人题解+java面经总结
java·开发语言·笔记·学习·算法
chenbingjie_c16 分钟前
C++ 继承全解析(从三种继承方式到菱形继承与内存布局)
开发语言·c++
火22517 分钟前
# C++ 微服务即时通讯系统(四):MySQL、Redis 与 Elasticsearch——数据分工与一致性
c++·mysql·微服务
飞Link8 小时前
什么是 AirSim?一文读懂无人机仿真平台
python·算法·无人机
xiaoye-duck10 小时前
《C++ 工具库实战》gflags 命令行参数解析库详解
c++·第三方库
一去不复返的通信er11 小时前
贪心算法-合并区间(LeetCode 56)
算法·leetcode·贪心算法