题目

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

输入
输入的第一行为一个整数n,表示棋盘的大小。 n小于等于8
接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个整数为0,表示对应的位置不可以放皇后。

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

样例输入

4
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1

样例输出

2

解题思路

本题显然是深度优先(DFS)的搜索,需要采用递归加上回溯的算法。由于要放置两种皇后,且由题意可知,黑、白皇后必然每一行都有且仅有一个,因此,可以先放好白皇后,再防止黑皇后;也可以逐行放置,放好第i行的白皇后,就放同一行的黑皇后,我采用的方法便是第二种。

首先,读入输入的“棋盘”,棋盘上规定了一些格子不允许放置皇后,为0;之后,便进入DFS搜索,每一次调用DFS的递归函数,需要放置黑、白皇后各1个,放置的位置要求同行、同列、两条对角线都不包含同颜色的棋子,且黑白皇后不处于同一格,直到递归到每一行都“放过”黑、白皇后。

易错点

  1. 注意两个判断斜对角线是否有皇后的hash散列,其长度为(2*n-1),而不是n(起初,我因为设置为了8,很多n>4的样例无法通过。。。);

  2. 在每一次递归结束之后,需要对称地将变化的参数还原,即需要回溯到上一层开始时的情况。

代码

#include<bits/stdc++.h>
using namespace std;
int a[8][8],num=0;
int hash_c[2][15],hash_m[2][15],hash_s[2][15];
void DFS(int n, int r){int i,j;if (r==n){num++;return ;}for (i=0;i<n;i++)//白皇后按照行占位{if (a[r][i]==1 && hash_c[0][i]==0 && hash_s[0][i-r+n-1]==0 && hash_m[0][i+r]==0)//判断两条对角线和列{hash_c[0][i] = 1;//该列、对角线已有白皇后hash_s[0][i-r+n-1] = 1;hash_m[0][i+r] = 1;a[r][i] = 0;//落子for (j=0;j<n;j++)//黑皇后按照行占位{if (a[r][j]==1 && hash_c[1][j]==0 && hash_s[1][j-r+n-1]==0 && hash_m[1][j+r]==0){hash_c[1][j] = 1;//该列已有黑皇后hash_s[1][j-r+n-1] = 1;hash_m[1][j+r] = 1;a[r][j] = 0;//落子DFS(n,r+1);//回溯hash_c[1][j] = 0;//该列已有黑皇后hash_s[1][j-r+n-1] = 0;hash_m[1][j+r] = 0;a[r][j] = 1;//允许落子}}//回溯hash_c[0][i] = 0;//该列、对角线已有白皇后hash_s[0][i-r+n-1] = 0;hash_m[0][i+r] = 0;a[r][i] = 1;//允许落子}}
}
int main()
{int n,i,j;scanf("%d",&n);for (i=0;i<n;i++)for (j=0;j<n;j++)scanf("%d",&a[i][j]);//读入初始化的数值DFS(n,0);printf("%d",num);return 0;
}

题目 1460: 2n皇后问题相关推荐

  1. 问题 1460: [蓝桥杯]黑白2n皇后问题

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

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

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

  3. 2n皇后 - 回溯

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

  4. 2n皇后问题(dfs)

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

  5. 2n皇后问题 / n皇后问题

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

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

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

  7. 2n皇后问题——Java

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

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

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

  9. 专题·深度优先搜索(DFS)【including 2N皇后,等边三角形,中国邮递员问题

    初见安~这篇我们来讲讲深搜(DFS) 前文我们讲过了递归[这里是递推递归],这里我们就要运用到啦~ 所谓深搜,也顾名思义就是在深度上搜索,到了尽头则返回上一层,换一条路继续搜--也就是递归思想. 先看 ...

最新文章

  1. jQuery 常用的效果函数(一)
  2. html中两个冒号,css中双冒号和单冒号区别
  3. 环信快速集成,以及实际集成中遇到的坑
  4. (kruskal算法复习+模板)Eddy's picture
  5. 烦人的幻灯片(信息学奥赛一本通-T1395)
  6. python分形几何_Python教程之绘制Mandelbrot集合
  7. mysql示例数据库
  8. springboot整合websocket实现简易版单人聊天
  9. Android中文翻译组 - 简介
  10. javascript中的原型
  11. Apache Wicket 7.2.0发布
  12. 谈谈互金跟银行里数据逻辑的差异
  13. C语言调用自定义交换函,C语言函数篇 - personal page of Msingwen - OSCHINA - 中文开源技术交流社区...
  14. Soul网关源码阅读(六)请求类型探索
  15. 25. JavaScript PopupAlert
  16. JAVA代码实现抖音转载视频无水印视频,亲测通过
  17. 怎么让python一直执行_怎么才能让Python多进程不间断执行任务
  18. 全志T3开发板——嵌入式入门学习测试教程(4)
  19. 记一次JAVA中字符串首字母大写转化为小写的Code
  20. 《富人的逻辑》书中的精髓:为什么暴富起来的人会在短期内失去财富,我们又该如何去创造财富和持续拥有财富。

热门文章

  1. 解决 Virtualbox 6.1.34 出现 End kernel panic - not syncing: attempted to kill the idle task
  2. c语言学习周报(2020.11.21-11.28)
  3. python+tensorflow CNN卷积神经网络手写字体识别
  4. ArcEngine代码 浏览器端图形JSON与后端IGeometry相互转换
  5. python实现KNN算法并可视化展示
  6. 1、ipywidgets
  7. mysql 替换所有字母,mysql如何替换掉字母
  8. 加油站都需要什么手续_开一个加油站需要什么手续,需要多少启动资金?
  9. uniapp调用c语言方法,使用uniapp开发的app/小程序需要注意:
  10. QQ群排名优化到霸屏的策略怎么做?