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

现在给定整数n,请你输出所有的满足条件的棋子摆法。
输入格式
共一行,包含整数n。
输出格式
每个解决方案占n行,每行输出一个长度为n的字符串,用来表示完整的棋盘状态。
其中”.”表示某一个位置的方格状态为空,”Q”表示某一个位置的方格上摆着皇后。
每个方案输出完成后,输出一个空行。
数据范围
1≤n≤91≤n≤9
输入样例:
4
输出样例:
.Q..
...Q
Q...
..Q.
..Q.
Q...
...Q
.Q..
第一种解法

思路:如上图,只需要判断列,左斜线(y = -x + b --> b = x + y)和右斜线(y = x + b--> b = y - x)三种情况,其中b(截距)就是我们的在格子的位置
#include<iostream> using namespace std; const int N = ;
int n;
char g[N][N];
bool col[N],dg[N],udg[N]; void dfs(int y){
if(n == y){
for(int i = ;i < n;i++) puts(g[i]);
puts("");
return;
} for(int i = ;i < n;i++){
if(col[i] == && dg[n + y - i] == && udg[ y + i] == ){
g[y][i] = 'Q';
col[i] = dg[n + y - i] = udg[y + i] = true;
dfs(y + );
g[y][i] = '.';
col[i] = dg[n + y - i] = udg[y + i] = false;
}
} } int main(){
scanf("%d",&n);
for(int i = ;i < n;i++)
for(int j = ;j < n;j++)
g[i][j] = '.';
dfs();
return ;
}
第二种解法
思路:每一个格子有放还是不放两种情况,顺次判断,时间复杂度n^2
//
#include<iostream> using namespace std; const int N = ;
int n;
char g[N][N];
bool row[N],col[N],dg[N],udg[N]; void dfs(int x,int y,int s){
if(y == n) y = ,x++;//如果出界就转回来 if(x == n){//枚举到最后一行
//这里有可能皇后不够
if(s == n){//如果摆放的皇后等于n,说明找到了一组解
for(int i = ;i < n;i++) printf("%s\n",g[i]);
puts("");
}
return;
}
//枚举格子的两种选择
//第一种是不放皇后
dfs(x,y+,s);//直接递归到下一个格子就可以了 //第二种是放皇后
if(!row[x] && !col[y] && !dg[n + x - y] && !udg[x + y]){
g[x][y] = 'Q';
row[x] = col[y] = dg[n + x - y] = udg[x + y] = true;
dfs(x,y + ,s + );
row[x] = col[y] = dg[n + x - y] = udg[x + y] = false;
g[x][y] = '.';
}
} int main(){
scanf("%d",&n);
for(int i = ;i < n;i++)
for(int j = ;j < n;j++)
g[i][j] = '.';
dfs(,,);//从左上角开始搜索
return ;
}
Acwing 843. n-皇后问题的更多相关文章
- 递归实现n(经典的8皇后问题)皇后的问题
问题描述:八皇后问题是一个以国际象棋为背景的问题:如何能够在8×8的国际象棋棋盘上放置八个皇后, 使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行.纵行或斜线上 ...
- 八皇后算法的另一种实现(c#版本)
八皇后: 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于 ...
- [LeetCode] N-Queens II N皇后问题之二
Follow up for N-Queens problem. Now, instead outputting board configurations, return the total numbe ...
- [LeetCode] N-Queens N皇后问题
The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens ...
- N皇后问题—初级回溯
N皇后问题,最基础的回溯问题之一,题意简单N*N的正方形格子上放置N个皇后,任意两个皇后不能出现在同一条直线或者斜线上,求不同N对应的解. 提要:N>13时,数量庞大,初级回溯只能保证在N< ...
- 数据结构0103汉诺塔&八皇后
主要是从汉诺塔及八皇后问题体会递归算法. 汉诺塔: #include <stdio.h> void move(int n, char x,char y, char z){ if(1==n) ...
- N皇后问题
题目描述 在n×n格的棋盘上放置彼此不受攻击的n个皇后.按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子.n后问题等价于再n×n的棋盘上放置n个后,任何2个皇后不妨在同一行或同 ...
- LeetCode:N-Queens I II(n皇后问题)
N-Queens The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no tw ...
- 八皇后问题_Qt_界面程序实现
//核心代码如下 //Queen--放置皇后 #include "queue.h" queue::queue() { *; ; this->board = new bool[ ...
随机推荐
- mongo客户端升级导致pymongo中使用聚合函数时出现异常
一.异常信息 The 'cursor' option is required, except for aggregate with the explain argument 二.解决办法 #部分源代码 ...
- 小程序外链跳转web-view系列问题
1.当小程序需要跳转外链时要上小程序后台配置业务域名,配置业务域名需要上传一个验证文件到你跳转的外链的服务器上的根目录里: 2. (1)第一种方法:.当小程序在同一个页面根据后台接口获取的url进行小 ...
- 爬虫加入数据post请求
formdata = {'...': '...', '......': '......', '......': '......'}HEADERS = { 'User-Agent': 'Mozilla/ ...
- 吴裕雄--天生自然 PYTHON3开发学习:面向对象
class MyClass: """一个简单的类实例""" i = 12345 def f(self): return 'hello wor ...
- J. Distance on the tree(树链剖分+线段树)
贴贴大佬的计蒜客题解: The Preliminary Contest for ICPC China Nanchang National Invitational and International ...
- Linux集群软件安装实战
一.需求和思路 1. 需求描述 公司有N个节点的集群,需要统一安装一个软件(jdk)需要开发一个脚本程序,实现对集群中的N个节点批量自动下载.安装jdk 2. 思路 1)编写一个启动脚本,用来发送一个 ...
- xcode垃圾目录以及Mac隐藏显示文件快捷键
~/Library/Developer/Xcode/DerivedData 显示:defaults write com.apple.finder AppleShowAllFiles -bool tru ...
- 查询Redis缓存
package me.zhengjie.monitor.rest; import me.zhengjie.common.aop.log.Log; import me.zhengjie.monitor. ...
- 基于css完成网页的国际化
css完成国际化 前提 在日常处理国际化的时候,通常是将key通过类似intl.xx(key)转换为对应环境的文案,可是如果需要在css中加入对应逻辑应该怎么做呢(比如在after的伪元素中显示不同的 ...
- Outlook邮件的右键菜单中添加自定义按钮
customUI代码如下: <customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui"> ...