问题描述
  给定一个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

分析:
首先我找到黑皇后可以放置的位置,然后根据黑皇后的位置和棋盘可以放棋子的位置来来寻找白皇后可以放置的位置。
在寻找黑皇后放置的位置采用回溯法,因此会考虑用递归函数来解决这个问题,递归函数的递归出口就是当已经找到棋子可以放置的最后一行后,
如果没有找到最后一行,则继续调用函数本身继续找。当黑皇后找到最后一行棋子的放置的位置后,也就是执行到函数的递归出口的时候,则调用白皇后的寻找函数,开始找白皇后的放置方式,白皇后的寻找函数与黑皇后函数的思路相同,只不过是要结合黑皇后的位置进行判断。

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
int chessboard[9][9] ;//棋盘
int blackqueen[9];//黑皇后放置
int whitequeen[9];//白皇后放置
int count2=0;//不同的放置情况的总数
int check(int queen[], int n) {               //check函数用来检测同一种皇后在摆放完前后,是否满足题意不在一行,不在一列,不在一条对角线上int i;for (i = 1; i < n; i++) {int judge = queen[i] - queen[n];if (judge == 0 || judge == i - n || judge == n - i ) {return 0;}}return 1;
}
void wqueen(int line, int n) {int i;if (line == n+1) {                         //如果白皇后在最后一行可以放置成功,那么摆放次数+1count2++;} else {for ( i = 1; i <= n; i++) {if (chessboard[line][i] ==1&&i!=blackqueen[line]) {whitequeen[line] = i;if (check(whitequeen, line)) {wqueen(line+1, n);}}}}
}
void bqueen(int line, int n) {int i;if (line==n+1) {wqueen(1, n);} else {for (i = 1; i <= n; i++) {if (chessboard[line][i] ==1) {blackqueen[line] = i;if (check(blackqueen, line)) {bqueen(line+1, n);}}}}
}
int main() {int n,i,j;cin>>n;getchar();for (i = 1; i <= n; i++) for (j = 1; j <= n; j++) cin>>chessboard[i][j];bqueen(1, n);cout<<count2<<endl;return 0;
}

2n皇后问题 简单递归相关推荐

  1. 蓝桥杯 2n皇后(java递归回溯)

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

  2. 蓝桥杯 八皇后 2n皇后问题

    八皇后问题 正式讲解2n皇后问题之前,首先聊聊八皇后问题 题目很简单,8*8棋盘上放上八个皇后,不能放在同一行.列,或者是同对角线. 我在做这题的时候,首先没有参考别人的思路.第一反应是DFS来解决, ...

  3. 2n皇后问题C语言实现

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

  4. python【蓝桥杯vip练习题库】BASIC-27 2n皇后问题(八皇后问题 搜索)

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

  5. 2n皇后 - 回溯

    题目地址:http://www.51cpc.com/web/problem.php?id=1172 Summarize: 1. 递归回溯: 2. 先扫完一种皇后,再扫描另一种: 3. 循环输入: 4. ...

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

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

  7. 蓝桥杯算法提高----2n皇后

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

  8. 2n皇后问题(dfs)

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

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

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

最新文章

  1. Android应用程序的调试
  2. Oracle weblogic线程Thread status分类和总结
  3. 独家对话阿里云函数计算负责人不瞋:你所不知道的 Serverless
  4. ARM assembly instruction set 汇总(一)
  5. ASP.NET Core WebListener 服务器
  6. Maximum Sum UVA - 108(连续子序列最大和—变形之子矩阵最大和)
  7. java订单类_基于Java创建一个订单类代码实例
  8. 16进制 hbase phoenix_HBase 和 Phoenix 的使用
  9. php两个时间月数,PHP获得两个日期之间的月数
  10. @PropertySource读取properties属性 中文乱码问题
  11. 美团刚做起网约车,滴滴就送外卖?你们倒真是相爱相杀
  12. SpaceSniffer 界面让我眼前一亮
  13. three.js加载STL格式模型(vue中使用three.js52)
  14. elasticsearch安装教程
  15. 中国公用计算机互联网网络简称为什么,中国公用计算机互联网国际联网管理办法...
  16. ERP系统如何完成工厂车间流程
  17. 手机没Root?你照样可以渗透路由器
  18. 从永远到永远-Navicat将MySQL数据库复制到另一个Mysql数据库
  19. 安卓8.1 AEX5.4 Xposed框架T9拨号移植
  20. 【Windows】如何修改远程桌面端口3389

热门文章

  1. 用matlab处理数字高程模型(DEM)之点云数据(point cloud data)
  2. c#使用百度智能云,文字识别、语音识别demo总结
  3. 【项目实战】YOLOV5 +实时吸烟目标检测+手把手教学+开源全部
  4. 华大单片机、STM32单片机如何做printf串口打印格式化输出
  5. crc16 ibm c语言,CRC16IBM(A001)的16字表长查表程序
  6. 学习java的一周总结
  7. anyproxy批量自动采集微信公众号文章
  8. [Vue warn]: Missing required prop: value
  9. 微服务和分布式和SpringCloud三者的关系
  10. 超低功耗寝室指纹锁(电池供电)