2n皇后问题【dfs】
<题目链接>
接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个整数为0,表示对应的位置不可以放皇后。
4
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
解题分析:
此题与n皇后问题十分类似,也是利用递归回溯求解,因为每行只能放一个白皇后,所以可以用一维数组记录皇后所放的位置,如 qw[x]=i,表明白皇后放在第x行第i列(黑皇后类似)。这题放2n个皇后,我采取的做法是,先放n个黑皇后,再放n个白皇后,具体实现见代码,一些细节方面我都标注出来了,并且做了详细解释。
#include <cstdio>
#include <cstring>
#include <cmath> #define clr(a,b) memset(a,b,sizeof(a))
int n,ans;
int map[][];
int qw[],qb[]; //白、黑皇后对应行所在的列数
int vis[][];
bool juge(int x,int cal[]){
if(!map[x][cal[x]]||vis[x][cal[x]])return false; //如果该点为0或者已经有皇后,则不能放
for(int i=;i<x;i++){
if(cal[i]==cal[x]||(abs(i-x)==abs(cal[i]-cal[x])))return false; //与之前放的同色皇后不在同一列,不在同一对角线
}
return true;
}
void init(){
ans=;
clr(vis,);clr(qw,);clr(qb,);
}
void dfs_w(int x){ //放白皇后
if(x==n+){
ans++;
return;
}
for(int i=;i<=n;i++){
qw[x]=i;
if(juge(x,qw)){
vis[x][i]=;
dfs_w(x+);
vis[x][i]=;
}
}
}
void dfs_b(int x){ //放黑皇后
if(x==n+){ //这里只用判断是不是到达第n+1行就能判断是否放了n个黑皇后,不用另外用一个变量记录放的黑皇后的数量
dfs_w(); //因为如果某一行没有放黑皇后,那么它根本就不能够向下一行搜索
return;
}
for(int i=;i<=n;i++){
qb[x]=i; //这里先放皇后再判断也是没问题的,因为如果放了皇后之后,发现不符合,这也没关系,因为qb[x]的值会被下一个循环
if(juge(x,qb)){ //的i值所覆盖。即使是循环的最后一个值不符合也没有关系,因为如果循环最后一个i不符合的话,那么它根本不会向下递归
vis[x][i]=; //也就自然不会对结果造成影响
dfs_b(x+);
vis[x][i]=;
}
}
}
int main(){
init();
scanf("%d",&n);
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
scanf("%d",&map[i][j]);
dfs_b();
printf("%d\n",ans);
return ;
}
2018-08-26
2n皇后问题【dfs】的更多相关文章
- 蓝桥杯—BASIC-27 2n皇后问题(DFS)
问题描述 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后, 使任意的两个黑皇后都不在同一行.同一列或同一条对角线上,任意的两个白皇后都不在同一行. 同一列或 ...
- n皇后问题与2n皇后问题
n皇后问题 问题描述: 如何能够在 n×n 的棋盘上放置n个皇后,使得任何一个皇后都无法直接吃掉其他的皇后 (任两个皇后都不能处于同一条横行.纵行或斜线上) 结题思路: 可采用深度优先算法,将棋盘看成 ...
- 蓝桥杯 基础训练 2n皇后
数月前做的2N皇后基本看书敲代码的,然后发现当时的代码不对,正好做到算法提高的8皇后·改,顺便把以前的代码顺带改了下,题目如下: 问题描述 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋 ...
- 基础训练 2n皇后问题
2n皇后问题 #include<iostream> #include<vector> using namespace std; int cnt = 0, n; vector&l ...
- 蓝桥杯 2n皇后问题 深搜
默认大家会了n皇后问题 基础练习 2n皇后问题 时间限制:1.0s 内存限制:512.0MB 问题描述 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和 ...
- 蓝桥杯试题 基础练习 2n皇后问题以及n皇后问题
在学习2n皇后之前,我们应该认识一下n皇后问题: 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上.你的任务是,对于 ...
- 对八皇后的补充以及自己解决2n皇后问题代码
有了上次的八皇后的基础.这次准备解决2n皇后的问题,: //问题描述// 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行./ ...
- C语言 · 2n皇后问题
基础练习 2n皇后问题 时间限制:1.0s 内存限制:512.0MB 锦囊1 搜索算法. 锦囊2 先搜索n皇后的解,在拼凑成2n皇后的解. 问题描述 给定一个n*n的棋盘,棋盘中 ...
- 蓝桥杯 基础训练 BASIC-27 2n皇后问题
基础练习 2n皇后问题 时间限制:1.0s 内存限制:512.0MB 问题描述 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都 ...
- 蓝桥--2n皇后问题(递归)--搬运+整理+注释
N皇后问题: #include <iostream> #include <cmath> using namespace std; int N; ];//用来存放算好的皇后位置. ...
随机推荐
- luogu P4160 [SCOI2009]生日快乐
传送门 考虑因为每个人的蛋糕体积要相等,如果切了一刀,那么要使得分当前蛋糕的人根据分成的两部分蛋糕的体积分成两部分人,所以假设当前有n人,切的这一刀要是在x或y的\(\frac{k}{n}(k\in ...
- 后端python基础
- 黑暗幽灵(DCM)木马详细分析
黑暗幽灵(DCM)木马详细分析 0x00 背景 只要插上网线或连上WIFI,无需任何操作,不一会儿电脑就被木马感染了,这可能吗?近期,腾讯反病毒实验室拦截到一个“黑暗幽灵”木马的新变种,该木马功能强大 ...
- 【Mysql sql inject】【入门篇】SQLi-Labs使用 part 1【01-11】
人员流动性过大一直是乙方公司痛点.虽然试用期间都有岗前学习,但老员工忙于项目无暇带新人成长,入职新人的学习基本靠自己不断摸索.期望看相关文档就可以一蹴而是不现实的.而按部就班的学习又很难短期内将知识有 ...
- Python算法:推导、递归和规约
Python算法:推导.递归和规约 注:本节中我给定下面三个重要词汇的中文翻译分别是:Induction(推导).Recursion(递归)和Reduction(规约) 本节主要介绍算法设计的三个核心 ...
- Linux命令学习总结:date命令【转】
本文转自:http://www.cnblogs.com/kerrycode/p/3427617.html 命令简介: date 根据给定格式显示日期或设置系统日期时间.print or set the ...
- oracle 远程导入导出(本地win)
导出 exp hongtastock_account/hongtastock_account@192.168.1.22/orcl file=D:\hongta\hongtastock_account. ...
- 53环境Jenkins新增工程配置
1. 登录http://10.179.175.53:8080/环境. 2. 点击新建任务,输入任务名称,并在复制一个NOS的类似工程即可. 3. 在配置页面,修改源码地址: 4. 点击完成,执行构建, ...
- @Html.Action()
背景 在这里主要想谈下mvc,最初几年都是用的webform,作为一个资深傻瓜程序员多年,后来到处听说mvc,终于在某天下定决心实验下mvc,其实关键还是在于easyui,因为它的请求数据方式和mvc ...
- SpringMVC_HelloWorld_02
一.新建项目 同SpringMVC_HelloWorld_01 二.配置文件 1.配置web.xml <?xml version="1.0" encoding="U ...