Description

给定一个n*n的棋盘,棋盘中有一些位置不能放皇后。现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行、同一列或同一条对角线上,任意的两个白皇后都不在同一行、同一列或同一条对角线上。问总共有多少种放法?n小于等于8。

Input

输入的第一行为一个整数n,表示棋盘的大小。
  

接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个整数为0,表示对应的位置不可以放皇后。

Output

输出一个整数,表示总共有多少种放法。

Sample Input

4

1 1 1 1

1 1 1 1

1 1 1 1

1 1 1 1

Sample Output

2
 #include<iostream>
#include<cmath>
using namespace std;
int n;
int map[][];//存储棋盘信息
int pos_black[];//存储黑皇后的行位置
int pos_white[]; //存储白皇后的行位置
int ans;
int check_white(int cur){//检验白皇后的位置是否符合要求
for(int i=;i<cur;i++){//cur列之前的列都和cur列比较
if(pos_white[i]==pos_white[cur]||abs(i-cur)==abs(pos_white[i]-pos_white[cur]))
//检验是否在同一行或者对角线上
return ;
}
return ;
}
int check_black(int cur){//检验黑皇后的位置是否符合要求,和白皇后一样
for(int i=;i<cur;i++){
if(pos_black[i]==pos_black[cur]||abs(i-cur)==abs(pos_black[i]-pos_black[cur]))
return ;
}
return ;
}
void dfs_white(int cur){//依次放置白皇后
if(cur==n+){//如果已经放置n个了,答案+1
ans++;
return;
}
for(int i=;i<=n;i++){
if(map[i][cur]==)//看地图条件是否符合
continue;
if(pos_black[cur]==i)//看有没有与黑皇后的位置重合
continue;
pos_white[cur]=i;//将白皇后放在第i行第cur列
if(check_white(cur))//如果刚才放置的这个白皇后符合要切
dfs_white(cur+);//就开始放置下一个白皇后
}
}
void dfs_black(int cur){//依次放置黑皇后
if(cur==n+){//如果已经放置n个了
dfs_white();//开始放置白皇后
return;
}
for(int i=;i<=n;i++){
if(map[i][cur]==)//如果地图符合条件
continue;
pos_black[cur]=i;//将黑皇后放在第i行第cur列
if(check_black(cur))//如果刚放置的黑皇后符合条件
dfs_black(cur+);//放置下一个黑皇后
}
}
int main(){
cin>>n;
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
cin>>map[i][j];
}
}
dfs_black();//开始放置黑皇后
cout<<ans;//输出
return ;
}
其实先放置黑皇后和白皇后都一样,本文以先放置黑皇后为例,
这样的话,放置白皇后的时候要注意,不能放在黑皇后上。
黑皇后放置完n个后,开始放置白皇后,白皇后放置完n个后,答案数加一,这是一次大循环
这里是一列一列的放,所以同一列一定不会有重复的,
只需判断 行 和 对角线 是否有重复的就行了
另外,其实哪个叫行哪个叫列都无所谓,你分得清就行

[蓝桥杯][基础训练]2n皇后问题的更多相关文章

  1. 蓝桥杯 基础训练 2n皇后

    数月前做的2N皇后基本看书敲代码的,然后发现当时的代码不对,正好做到算法提高的8皇后·改,顺便把以前的代码顺带改了下,题目如下: 问题描述 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋 ...

  2. 蓝桥杯—BASIC-27 2n皇后问题(DFS)

    问题描述 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后, 使任意的两个黑皇后都不在同一行.同一列或同一条对角线上,任意的两个白皇后都不在同一行. 同一列或 ...

  3. 蓝桥杯之 2n皇后问题(双层dfs,暴力)

    Description 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后 和n个白皇后,使任意的两个黑皇后都不在同一行.同一列或同一条对角线上,任意的两 个白皇后都不在同 ...

  4. 蓝桥杯训练 2n皇后问题

    给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行.同一列或同一条对角线上,任意的两个白皇后都不在同一行.同一列或同一条对角线上 ...

  5. 蓝桥杯训练 2n皇后

    问题描述 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行.同一列或同一条对角线上,任意的两个白皇后都不在同一行.同一列或同一 ...

  6. 蓝桥杯 基础训练 BASIC-27 2n皇后问题

    基础练习 2n皇后问题   时间限制:1.0s   内存限制:512.0MB 问题描述 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都 ...

  7. 基础训练 2n皇后问题

    2n皇后问题 #include<iostream> #include<vector> using namespace std; int cnt = 0, n; vector&l ...

  8. java 蓝桥杯基础训练 回文数

    public class _8回文数 { //两种方法都可以 // public static void main(String[] args) { // String zheng ="&q ...

  9. [蓝桥杯][基础训练]Sine之舞

    Description 最近FJ为它的奶牛开设了数学分析课,FJ知道,若要学好这门课,必须有一个好的三角函数基本功. 所以他为奶牛们做了一个“Sine之舞”的游戏,寓教于乐,提高奶牛的计算能力. 不妨 ...

随机推荐

  1. 测度论--长度是怎样炼成的[zz]

    http://www.58pic.com/newpic/27882296.html http://www.58pic.com/newpic/27893137.html http://699pic.co ...

  2. C#.net连接Sybase的方法

    一 .ODBC方式连接 1 安装Sybase客户端,安装ODBC驱动,配置DSN<略> 2 连接代码 string strconn = "DSN=TEST;SRVR=TEST;D ...

  3. 杭电oj_1713——相遇周期(java实现)

    question:相遇周期 思路: 首先将两个分数化为最简形式(也就是分子分母同时除以最大公约数) 然后题意是要求两个分数的最小公倍数 借助以下两个公式,就可以求出结果 1.最小公倍数*最大公约数 = ...

  4. Linux 基本命令简单学习

    平常工作中需要使用到的一些Linux基本命令,简单记录: 通过订单号查看日志:   cat /---/---/xxxx20190908.log | grep C52918588112261 -C 5 ...

  5. ssh: connect to git@gitlab.xxxxx.com:xxxxx.git port 22: Connection refused

    公司服务器上的gitlab项目添加了ssh密钥,但是操作时却报错ssh: connect to git@gitlab.xxxxx.com:xxxxx.git port 22: Connection r ...

  6. vue基础实例

    <html> <head> <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"> ...

  7. Python爬取mc皮肤【爬虫项目】

    首先,找到一个皮肤网站,其中一个著名的皮肤网站就是 https://littleskin.cn .进入网站,我们就会见到一堆皮肤,这就是今天我们要爬的皮肤.给各位分享一下代码. PS:另外很多人在学习 ...

  8. vs2015制作一个超级简单的MVC项目

    使用vs2015制作一个超级简单的MVC项目   本文链接:https://blog.csdn.net/qq_40919762/article/details/100705314 直奔主题一,创建一个 ...

  9. Flink系统配置

    Flink 系统配置 Flink 提供了多个配置参数,用于调整Flink的行为与性能,所有参数均在flink-config.yaml 文件中.下面我们介绍一下几个主要配置. Java and Clas ...

  10. 题解【洛谷P2323】 [HNOI2006]公路修建问题

    题面 题解 跑两遍\(Kruskal\),第一次找出\(k\)条一级公路,第二次找出\(n - k - 1\)条二级公路,直接计算\(MST\)的权值之和即可. 代码 #include <ios ...