八皇后-n皇后-2n皇后
给定一个 n*nn∗n 的棋盘,棋盘中有一些位置不能放皇后。现在要向棋盘中放入 nn 个黑皇后和 nn 个白皇后,使任意的两个黑皇后都不在同一行、同一列或同一条对角线上,任意的两个白皇后都不在同一行、同一列或同一条对角线上。问总共有多少种放法?nn 小于等于 88。
输入格式
输入的第一行为一个整数 nn,表示棋盘的大小。
接下来 nn 行,每行 nn 个 00 或 11 的整数,如果一个整数为11,表示对应的位置可以放皇后,如果一个整数为 00,表示对应的位置不可以放皇后。
输出格式
输出一个整数,表示总共有多少种放法。
样例输入1
4 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
样例输出1
2
样例输入2
4 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1
样例输出2
0
代码:
n皇后代码
#include <bits/stdc++.h>
using namespace std;
// n皇后所有位置都可以放
// 带有不能安放位置的n皇后
int a[8][8];
int n;
int mark[8];
int cnt = 0;//计数
int judge(int row,int column)
{//判断列和斜角for(int i = 0; i < row;i++){if(/*判断列*/column == mark[i]||/*判断斜角*/abs(row-i)==abs(column-mark[i]))return 0;}return 1;
}
void Queue(int row)
{if(row == n)cnt++;//当找到一个解决方法时就增加else{for(int i = 0; i < n; i++){if(judge(row,i) )//&&a[row][i]/*可能是当前位置存在障碍不可以放*/ /*这个就是判断当前位置能否放置{ //location数组标记每一列 mark[row] = i;//第row行的第i个放置皇后Queue(row+1);//每一行row在变化不存在每一行有多个皇后 故而只用判断斜角和列}}}
}
int main()
{memset(mark,0,sizeof mark);scanf("%d",&n);//如果输入的带有不能安放皇后的棋盘//输入时 0代表不能安放 1代表可以安放for(int i = 0; i < n; i++)for(int j = 0; j < n; j++)scanf("%d",&a[i][j]);Queue(0);cout<<cnt<<endl;return 0;
}
本题目解决代码:
#include <bits/stdc++.h>
using namespace std;
int a[8][8];
int n;
int markblack[8];
int markwrite[8];
int cnt = 0;//计数
int judgeblack(int row,int column)
{for(int i = 0; i < row; i++){if(column == markblack[i]||abs(row-i) == abs(column-markblack[i]))return 0;}return 1;
}
int judgewrite(int row,int column)
{for(int i = 0; i < row; i++){if(column == markwrite[i]||abs(row-i) == abs(column-markwrite[i]))return 0;}return 1;
}
int Queue(int row_black,int row_write)
{if(row_black == n){//再来搜索白皇后 if(row_write == n)cnt++;else{for(int i = 0; i < n; i++){if(a[row_write][i]&&judgewrite(row_write,i)){markwrite[row_write] = i;Queue(row_black,row_write+1);}}}}else{for(int i = 0; i < n; i++){if(a[row_black][i]&&judgeblack(row_black,i)){markblack[row_black] = i;a[row_black][i] = 0; //存放黑皇后 后不能再存放白皇后 故令其为0Queue(row_black+1,row_write);a[row_black][i] = 1; //对应}}}
}
int main()
{scanf("%d",&n);//如果输入的带有不能安放皇后的棋盘for(int i = 0; i < n; i++)for(int j = 0; j < n; j++)scanf("%d",&a[i][j]);Queue(0,0);cout<<cnt<<endl;return 0;
}
八皇后-n皇后-2n皇后相关推荐
- 蓝桥杯 八皇后 2n皇后问题
八皇后问题 正式讲解2n皇后问题之前,首先聊聊八皇后问题 题目很简单,8*8棋盘上放上八个皇后,不能放在同一行.列,或者是同对角线. 我在做这题的时候,首先没有参考别人的思路.第一反应是DFS来解决, ...
- python【蓝桥杯vip练习题库】BASIC-27 2n皇后问题(八皇后问题 搜索)
试题 基础练习 2n皇后问题 资源限制 时间限制:1.0s 内存限制:512.0MB 问题描述 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个 ...
- 蓝桥杯 基础练习 2n皇后
目 录 题目描述 题解 [算法]八皇后,蓝桥杯2n皇后 算法思路详细讲解(Java) 题目描述 题目描述 给定一个 n × n 的棋盘,棋盘中有一些位置不能放皇后. 现在要向棋盘中放入 n 个黑皇 ...
- 皇后问题,8皇后、n皇后、2n皇后
8皇后问题 问题描述: 八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例. 该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出: 在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意 ...
- 蓝桥杯每日积累-打破算法壁垒,攻略2n皇后问题
题前感言 2n皇后问题讲的是黑皇后和白皇后间相爱相杀的故事,相同颜色的皇后只要站在互相看得到的地方便会自相残杀,这怎么能行?多好的妹子,我们要做的事情就是阻止她们互相残杀! 算法准备 看到题我很兴奋, ...
- 2n皇后 - 回溯
题目地址:http://www.51cpc.com/web/problem.php?id=1172 Summarize: 1. 递归回溯: 2. 先扫完一种皇后,再扫描另一种: 3. 循环输入: 4. ...
- 解题报告——蓝桥杯 试题 基础练习 2n皇后问题(附n皇后代码)
心路历程: 之前并没有系统的学过递归和搜索,在学这道题前先学习了深搜.递归,并敲掉了经典N皇后,因此理解起来难度也不是很大. 没有基础的同学一定要先把N皇后看会在碰这道题.下面会有N皇后逐步讲解的视频 ...
- 蓝桥杯算法提高----2n皇后
2n皇后 问题描述 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行.同一列或同一条对角线上,任意的两个白皇后都不在同一行.同 ...
- 2n皇后问题(dfs)
2n皇后问题 题目描述 问题描述 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行.同一列或同一条对角线上,任意的两个白皇后都 ...
- 蓝桥杯 基础练习 2n皇后问题(从n皇后问题入手)
n皇后问题是一个以国际象棋为背景的问题:在n×n的国际象棋棋盘上放置n个皇后,使得任何一个皇后都无法直接吃掉其他的皇后,即任意两个皇后都不能处于同一条横行.纵行或斜线上. 利用递归和回溯算法轻松解决 ...
最新文章
- android ble5.0添加扫描过滤,bluetooth-lowenergy
- MyBatis入门及CRUD
- 牛客网 短最优升级路径 【Dijkstra算法】+【路径记录】
- 『设计模式』写代码偷懒小技巧,程序开发大智慧--享元模式
- 【Elasticsearch】Elasticsearch gateway 流程分析
- 回归模型分类(自回归AR模型、向量自回归VAR模型等)
- mengento 数据库模型
- IntelliJ 通过 Cloud Toolkit 登陆远程服务器终端 Terminal
- c#正则表达式应用实例
- 数据增强在贝壳找房文本分类中的应用
- gradle 关于repository配置
- Navicat for mysql破解版安装步骤
- cdh安装hadoop组件后一些常用设置
- Setup Factory 提示 Invalid start mode : archive filename 的解决办法
- 怎样检测php语法错误,检查php的语法错误
- JavaScript实现DoublyLinkedList双链表的算法(附完整源码)
- 2019杭电多校6,E.Snowy Smile(线段树维护子段和)
- 昆仑通态触摸屏保存历史曲线_mcgs历史数据保存到U盘
- k8s集群ClusterIP不能使用
- 用malloc开辟二维数组的三种办法