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. Mysql--Database Exception (#42) 数据库错误

    mysql是phpstudy中的mysql,出现这个错误八成是php.ini中没有设置mysql.sock 使用探针或者phpinfo查看php.ini的位置. sudo find / -name m ...

  2. 运行web项目端口占用问题

    ---恢复内容开始--- 有时候运行web项目会提示8080端口已经被占用这一类问题(Error running Tomcat8: Address localhost:1099 is already ...

  3. 火狐浏览器导出EXCEL 表格,文件名乱码问题

    牢骚:今天又是一个不太平的日子,打开任务表一看里面有一堆bug,其中有一个就是今天要说的这个关于商品导出的问题,本功能是临时授命接一个任务,本来呢这个导出功能在系统各大模块已经都很成熟了,但是总有一个 ...

  4. Windows & Linux服务器如何禁用ping总结

      有时候你ping一些服务器或网站,你会发现ping不通,这个是因为对方出于安全因素(security reason)或避免网络拥堵(avoid network congestion)等原因,禁用了 ...

  5. linux 时间和日期的设置

    Linux机器上的时间比较复杂,有各式各样的时钟和选项等等.机器里有两个时钟,硬件时钟从根本上讲是CMOS时钟,而系统时钟是由内核维护的. 1. 修改硬件时钟 (1)更新机器的硬件时间.命令为:hwc ...

  6. 打开CSDN论坛出现403

    打开CSDN论坛出现403 在查找资料的过程中,出现"403-禁止访问"

  7. am335x在ubuntu下使用StarterWare编写裸机程序并在CCS中用Jlink调试

    StarterWare在AM335X上的烧录运行 步骤:1.下载安装StarterWare,我们团购的SK需要02.00.00.07版本.最近外网访问慢,我上传到论坛.2.找一张miniSD卡,不需要 ...

  8. SQLyog键盘快捷方式

    SQLyog键盘快捷方式 连接 Ctrl+M 创建新连接 Ctrl+N 以当前连接属性创建新连接 Ctrl+F4/Ctrl+W 断开当前连接 Ctrl+Tab 切换到下一个连接 Ctrl+Shift+ ...

  9. freemarker中的left_pad和right_pad

    freemarker中的left_pad和right_pad 1.简易说明 (1)left_pad 距左边 (2)right_pad 距右边 (3)当仅仅只有一个参数时,插入的是空白:当有两个参数时, ...

  10. directX枚举系统设备类

    void CSysEnumDlg::DisplayFullCategorySet(void){    USES_CONVERSION;    HRESULT hr;    IEnumMoniker * ...