【蓝桥杯训练】------2n皇后问题
来源:互联网 发布:淘宝偷图技巧 编辑:程序博客网 时间:2024/05/29 17:41
题目描述
给定一个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
#include <cstdio>#include<iostream>using namespace std;int chessb[9][9];//保存棋盘初始状态int b[9];//白皇后的放置位置 i行是第x列 b[i]=x;int h[9];//同上,不过是黑int countn=0;//计算方案数int check(int queen[],int n)//判断同一列或者两对角线是否已经放置了{ int i; for (i = 1; i < n; i++) { int judge=queen[i]-queen[n]; if(judge==0||judge==i-n||judge==n-i) { return 0; } } return 1;}void bai(int line,int n){ int i; if(line==n+1) { countn++; } else { for(i=1; i<=n; i++) { if(chessb[line][i]==1&&i!=h[line])//可以放置 { b[line]=i; if(check(b,line)) { bai(line+1,n); } } } }}void hei(int line,int n)//黑皇后的搜索{ int i; if(line==n+1) //黑皇后搜索完毕 { bai(1,n); //开始搜索白皇后 } else { for(i=1; i<=n; i++) { if(chessb[line][i]==1)//可以放置 { h[line]=i; if(check(h,line)) { hei(line+1,n); } } } }}int main(){ int n,i,j; cin>>n; for (i = 1; i <= n; i++) { for (j = 1; j <= n; j++) { scanf("%d",&chessb[i][j]); } } hei(1,n); cout<<countn; return 0;}
0 0
- 【蓝桥杯训练】------2n皇后问题
- 蓝桥杯训练:2n皇后问题
- 蓝桥杯 2n皇后问题
- 蓝桥杯 2n皇后问题
- 蓝桥杯:2n皇后问题
- 蓝桥杯 2n皇后问题
- 2n皇后问题
- 2n皇后问题
- 2n皇后问题
- 2n皇后问题
- 2n皇后问题
- 2n皇后问题
- 2N皇后问题
- 2n皇后问题
- 2n皇后问题
- 2n皇后问题
- 2n皇后问题
- 2n皇后问题
- JS快捷键
- PRML Charpter 2 Probability Distribution 2.3.5 Sequential estimation讲义摘要
- 解决:AMQ应用部署到weblogic服务器上出现“找不到匹配的方法setLifo"
- CUDA: 使用shared memory
- poj3190
- 【蓝桥杯训练】------2n皇后问题
- 有没有办法获取最近操作的联系人
- Ubuntu 14.04 安装 Intel MKL + OpenCV
- 【spoj375】Query on a tree【树链剖分】【或者动态树,那样常数就完了T_T】
- C++省略号类型和参数个数不确定函数参数范例
- VC++动态链接库(DLL)编程深入浅出(zz)
- 反距离权重法生成DEM(利用KD-tree实现KNN算法)
- C#实现队列的基本操作
- 运用CXF-3.0.4中遇到的问题