n皇后问题
问题描述:
  如何能够在 n×n 的棋盘上放置n个皇后,使得任何一个皇后都无法直接吃掉其他的皇后 (任两个皇后都不能处于同一条横行、纵行或斜线上)
结题思路:
  可采用深度优先算法,将棋盘看成一个n*n的地图,每层有n个顶点,共有n层。然后套用dfs,每一层要判断与前面的皇后会不会冲突,如果不会,则可以放置皇后(可以走这个顶点),直到最后一层,将解决方案数量加一就行了。
注:用一维数组 queen[10] 即可代表女皇的横竖坐标,下标为第几行,结果则为第几列。
  当 abs(queen[i] - queen[n]) == abs(n - i) 时说明在一个斜线上(y2-y1==x2-x1 说明两点成45°角)
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std; int queen[], sum=;
int Max;
//此函数用于判断皇后当前皇后是否可以放在此位置
int PLACE(int n) /* 检查当前列能否放置皇后 */
{//abs(queen[i] - queen[n]) == abs(n - i)用于约束元素不能再同一行且不能再同一条斜线上
int i;
for(i = ; i < n; i++) /* 检查横排和对角线上是否可以放置皇后 */
{
if(queen[i] == queen[n] || abs(queen[i] - queen[n]) == abs(n - i))
{
return ;
}
}
return ;
} //核心函数,回溯法的思想
void NQUEENS(int n) /* 回溯尝试皇后位置,n为横坐标 */
{
int i;
for(i = ; i < Max; i++)
{
queen[n] = i;
if(PLACE(n))
{
if(n == Max)
{
sum++;
}
else
{
NQUEENS(n + );
}
}
}
} int main()
{
cin>>Max;
NQUEENS(); /* 从横坐标为0开始依次尝试 */
printf("总共的解法有%d种\n", sum); return ;
}
2n皇后:
问题描述
  给定一个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皇后就容易理解了。只要在白皇后摆放好后再用同样的方式摆放黑皇后即可,不过也要注意白皇后不能和黑皇后摆在同一个位置(i!=wqueen[n])
以及map上值为0不能摆放皇后,加上这两个两个条件即可。
 
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std; int bqueen[], wqueen[], sum=; // Max为棋盘最大坐标
int Max;
int map[][]; //map用于判断白皇后是否已经放置(2) 或 该位置可以放置(1) 或 不可放置(0) int w_place(int n) /* 检查当前列能否放置白皇后 */
{
int i; //第i个皇后
for(i = ; i < n; i++) //检查横排和对角线上是否可以放置皇后
{
if(wqueen[i]==wqueen[n] || abs(wqueen[i]-wqueen[n])==abs(n-i))
{
return ;
}
}
return ;
} int b_place(int n)
{
int i; //第i个皇后
for(i = ; i < n; i++) //检查横排和对角线上是否可以放置皇后
{
if(bqueen[i]==bqueen[n] || abs(bqueen[i]-bqueen[n])==abs(n-i))
{
return ;
}
}
return ;
} void b_queen(int n)
{
int i;
for(i=; i<Max; i++)
{
if(map[n][i])
{
bqueen[n] = i;
if(b_place(n) && i!=wqueen[n]) //判断可以摆在该坐标
{
if(n==Max-) //判断是否是最后一个皇后(最后一行)
{
sum++;
}
else
{
b_queen(n+);
}
}
}
}
} void w_queen(int n) /* 回溯尝试皇后位置,n为横坐标 */
{
int i;
for(i=; i<Max; i++)
{
if(map[n][i])
{
wqueen[n] = i;
if(w_place(n))
{
if(n==Max-)
{
b_queen();
}
else
{
w_queen(n+);
}
}
}
}
} int main()
{
cin>>Max;
for(int i=; i<Max; i++)
for(int j=; j<Max; j++)
scanf("%d", &map[i][j]);
w_queen();
printf("%d\n", sum); return ;
}
 

n皇后问题与2n皇后问题的更多相关文章

  1. Java实现 蓝桥杯VIP 基础练习 2n皇后问题

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

  2. 对八皇后的补充以及自己解决2n皇后问题代码

    有了上次的八皇后的基础.这次准备解决2n皇后的问题,: //问题描述// 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行./ ...

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

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

  4. C语言 · 2n皇后问题

    基础练习 2n皇后问题   时间限制:1.0s   内存限制:512.0MB        锦囊1 搜索算法. 锦囊2 先搜索n皇后的解,在拼凑成2n皇后的解. 问题描述 给定一个n*n的棋盘,棋盘中 ...

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

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

  6. 蓝桥--2n皇后问题(递归)--搬运+整理+注释

    N皇后问题: #include <iostream> #include <cmath> using namespace std; int N; ];//用来存放算好的皇后位置. ...

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

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

  8. 计蒜课--2n皇后、n皇后的解法(一般操作hhh)

    给定一个 n*nn∗n 的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入 nn 个黑皇后和 nn个白皇后,使任意的两个黑皇后都不在同一行.同一列或同一条斜线(包括正负斜线)上,任意的两个白皇后都 ...

  9. 2n皇后 - 回溯

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

随机推荐

  1. Spring Boot:Consider defining a bean of type '*.*.*' in your configuration解决方案

    果然不看教程直接使用在遇到问题会懵逼,连解决问题都得搜半天还不一定能帮你解决了... ***************************APPLICATION FAILED TO START*** ...

  2. hdu5296 01字典树

    根据二进制建一棵01字典树,每个节点的答案等于左节点0的个数 * 右节点1的个数 * 2,遍历整棵树就能得到答案. AC代码: #include<cstdio> using namespa ...

  3. RestTemplate 支持服务器内302重定向

    Stack Overflow 里找到的代码,可以正常返回服务器302重定向后的响应 final RestTemplate restTemplate = new RestTemplate(); fina ...

  4. 2015最新iOS学习线路图

    iOS是由苹果公司开发的移动操作系统,以xcode为主要开发工具,具有简单易用的界面.令人惊叹的功能,以及超强的稳定性,已经成为iPhone.iPad 和iPod touch 的强大基础:iOS 内置 ...

  5. 1.1 PCI总线的组成结构

    如上文所述,PCI总线作为处理器系统的局部总线,是处理器系统的一个组成部件,讲述PCI总线的组成结构不能离开处理器系统这个大环境.在一个处理器系统中,与PCI总线相关的模块如图1?1所示. 如图1?1 ...

  6. zTree实现单独选中根节点中第一个节点

    zTree实现单独选中根节点中第一个节点 1.实现源码 <!DOCTYPE html> <html> <head> <title>zTree实现基本树& ...

  7. (六)java结构控制语句

    选择语句,也叫条件分支语句:if--else和switch--case:其中if--else中的else是可选的,但是switch--case中的case是必须的.     switch后的条件必须是 ...

  8. Spring Security验证流程剖析及自定义验证方法

    Spring Security的本质 Spring Security本质上是一连串的Filter, 然后又以一个独立的Filter的形式插入到Filter Chain里,其名为FilterChainP ...

  9. Codeforces Round #425 (Div. 2) D.Misha, Grisha and Underground

    我奇特的脑回路的做法就是 树链剖分 + 树状数组 树状数组是那种 区间修改,区间求和,还有回溯的 当我看到别人写的是lca,直接讨论时,感觉自己的智商收到了碾压... #include<cmat ...

  10. .Net Core使用Redis的一个入门简单Demo

    本例子讲述一个在.Net core环境中对Redis数据库进行增删改查操作. 首先,要安装好Redis数据库,至于怎么安装,本文不再赘述,可以自行百度,有很详细的教程. 安装好之后,在CMD中输入 r ...