问题描述
给定一个n*n的棋盘,棋盘中有一些位置不能放皇后。现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行、同一列或同一条对角线上,任意的两个白皇后都不在同一行、同一列或同一条对角线上。问总共有多少种放法?n小于等于8。
输入格式
输入的第一行为一个整数n,表示棋盘的大小。
接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个整数为0,表示对应的位置不可以放皇后。
输出格式
输出一个整数,表示总共有多少种放法。
样例输入
4
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
样例输出
2
样例输入
4
1 0 1 1
1 1 1 1
1 1 1 1
1 1 1 1
样例输出
0

分析:和n皇后问题一样,只不过2n皇后要用两个深度优先搜索。
调用放置白皇后的递归dfs,先放置白皇后,当每一个白皇后放置成功之后,在递归的return语句之前,
新建一个棋盘,复制原来的棋盘后并把放置了白皇后的位置置为0,调用摆放黑皇后的深度优先搜索。
当黑皇后也找到相应的解法后,cnt++; 最后输出cnt的值。

#include <iostream>
#include <cmath>
#include <vector>
using namespace std;
int cnt = 0;bool issafe(vector<vector<int> > pic, vector<int> pos, int row) {for(int i = 0; i < row; i++) {if(pos[i] == pos[row] || abs(i - row) == abs(pos[i] - pos[row]))return false;}return true;
}void blackdfs(vector<vector<int> > blackpic, vector<int> blackpos, int n, int blackrow) {if(blackrow == n) {cnt++;return ;}for(blackpos[blackrow] = 0; blackpos[blackrow] < n; blackpos[blackrow]++) {if(blackpic[blackrow][blackpos[blackrow]] == 1 && issafe(blackpic, blackpos, blackrow)) {blackdfs(blackpic, blackpos, n, blackrow + 1);}}
}void dfs(vector<vector<int> > pic, vector<int> pos, int n, int row) {if(row == n) {vector<vector<int> > blackpic(n, vector<int>(n));for(int i = 0; i < n; i++) {for(int j = 0; j < n; j++) {blackpic[i][j] = pic[i][j];}}for(int i = 0; i < n; i++) {blackpic[i][pos[i]] = 0;}vector<int> blackpos(n);blackdfs(blackpic, blackpos, n, 0);return ;}for(pos[row] = 0; pos[row] < n; pos[row]++) {if(pic[row][pos[row]] == 1 && issafe(pic, pos, row)) {dfs(pic, pos, n, row + 1);}}
}int main() {int n;cin >> n;vector<vector<int> > pic(n, vector<int>(n));vector<int> pos(n);for(int i = 0; i < n; i++) {for(int j = 0; j < n; j++) {cin >> pic[i][j];}}dfs(pic, pos, n, 0);cout << cnt;return 0;
}

蓝桥杯 BASIC-27 基础练习 2n皇后问题相关推荐

  1. 蓝桥杯练习系统 基础练习 全部习题 题目及AC代码(包括VIP试题)C++

    蓝桥杯练习系统 基础练习 全部习题ac代码 看在作者这么肝的份上点个赞吧

  2. 蓝桥杯物联网竞赛基础图文教程——时钟选择

    蓝桥杯物联网竞赛基础图文教程--时钟选择 1什么是时钟 时钟是单片机运行的基础,时钟信号推动单片机内各个部分执行相应的指令.时钟系统就是CPU的脉搏,决定cpu速率,像人的心跳一样 只有有了心跳,人才 ...

  3. 蓝桥杯 基础练习 2n皇后

    目   录 题目描述 题解 [算法]八皇后,蓝桥杯2n皇后 算法思路详细讲解(Java) 题目描述 题目描述 给定一个 n × n 的棋盘,棋盘中有一些位置不能放皇后. 现在要向棋盘中放入 n 个黑皇 ...

  4. 蓝桥杯基础练习 - 2n皇后问题解析

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

  5. 解题报告——蓝桥杯 试题 基础练习 2n皇后问题(附n皇后代码)

    心路历程: 之前并没有系统的学过递归和搜索,在学这道题前先学习了深搜.递归,并敲掉了经典N皇后,因此理解起来难度也不是很大. 没有基础的同学一定要先把N皇后看会在碰这道题.下面会有N皇后逐步讲解的视频 ...

  6. 蓝桥杯 基础练习 2n皇后问题(从n皇后问题入手)

    n皇后问题是一个以国际象棋为背景的问题:在n×n的国际象棋棋盘上放置n个皇后,使得任何一个皇后都无法直接吃掉其他的皇后,即任意两个皇后都不能处于同一条横行.纵行或斜线上. 利用递归和回溯算法轻松解决 ...

  7. 蓝桥杯练习系统-基础练习34道题解答答案全汇总(c/c++)

    蓝桥杯练习系统BASIC-13 数列排序(c++,利用sort) 蓝桥杯练习系统BASIC-12 十六进制转八进制(c++,利用string) 蓝桥杯练习系统BASIC-11 十六进制转十进制(c++ ...

  8. 蓝桥杯Java必备基础知识总结大全【3W字】持续更新中

    本文会持续更新,如果对您有帮助的话可以点点关注,双击 本人2021年蓝桥杯C++B组国二,今年转战Java,并整理此文,希望能够对大家有所帮助,第一次写这么长的文章,可能有的地方写的不是很好,还请大家 ...

  9. 【蓝桥杯】 《3W字数总结》 蓝桥杯Java必备基础知识以及国赛真题解析

    本文会持续更新,如果对您有帮助的话可以点点关注,双击 本人2021年蓝桥杯C++B组国二,今年转战Java,并整理此文,希望能够对大家有所帮助,第一次写这么长的文章,可能有的地方写的不是很好,还请大家 ...

最新文章

  1. PHP伪类型和伪变量
  2. JZOJ 3786. 【NOI2015模拟8.19】图
  3. NAMENODE工作机制,元数据管理(元数据存储机制、元数据手动查看)、元数据的checkpoint、元数据目录说明(来自学习资料)
  4. np.identity()
  5. 19岁白帽子通过bug悬赏赚到一百万美元--转
  6. UnicodeDecodeError: 'ascii' codec can't decode byte 0xe5 in position 85
  7. 子查询返回多个字段_ElasticSearch搜索之QueryFiltering、多/单字符串的多字段查询...
  8. oracle查看session阻塞,oracle查询blocking session阻塞情况
  9. [转]如何用VS2005制作Web安装程序
  10. matlab 判断两个矩阵是否相等
  11. ST-Link 驱动安装
  12. MySQL复制之gtid_purged与gtid_executed
  13. 非平衡电桥电阻计算_非平衡电桥的原理和应用 - 范文中心
  14. 电信物联网平台对接教程
  15. 如何将PayPal中的美元以人民币的形式提现到建设银行卡中?
  16. 为什么说盲盒市场充满机遇
  17. 动画三:2D转换(超详细!)
  18. 大数据学习完可以做什么
  19. 图像特征提取与匹配——SIFT算法
  20. spring MVC 视屏在线播放(不限 )

热门文章

  1. SQL Server中删除重复数据的几个方法
  2. 01-HTML基础与进阶-day3-录像236
  3. Session的创建与销毁时机
  4. collectd 5.7.2 发布,系统监控和统计工具
  5. exchange2010 取消OWA内更改密码选项
  6. with(nolock)解释
  7. [转]Resource for Windows Phone 7
  8. Apache Server 修复两个高危缺陷
  9. NIST 发布关于使用“行政令-关键软件”的安全措施指南
  10. 因未交赎金,世界航天巨头机密文档遭勒索软件公开