基础练习 2n皇后问题  
时间限制:1.0s   内存限制:512.0MB
问题描述
  给定一个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
 
示例代码:
 import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader; public class Main {
private static int n; // n*n棋盘,n个黑皇后和n个白皇后
private static int[][] palace; //棋盘
private static int[] column_num; //记录每个皇后放的列号
private static int count; //统计方案数
private static boolean flag = false; public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
palace = new int[n][n];
column_num = new int[n]; for(int i = 0; i < n; i++){
String[] str = br.readLine().split(" ");
for(int j = 0; j < n; j++){
palace[i][j] = Integer.parseInt(str[j]);
}
} place(0); System.out.println(count);
}
// 放皇后
private static void place(int quee) {
if(quee == n && !flag){ //如果n个黑皇后已经放置好,将标记置为true,然后放置n个白皇后
flag = true;
place(0);
flag = false;
}else if(quee == n && flag){ //如果黑白皇后都已经放置好,则方案数加1
count++;
}else{
for(int column = 0; column < n; column++){ //遍历列
if(palace[quee][column] == 1){ //如果发现此位置为1,即可以放皇后
int temp = column_num[quee]; //先将之前放置的列号记录下来,如果此时的列位置不能放皇后,则将之前的列号返回
column_num[quee] = column;
if(judge(quee)){ //判断放置的位置与 放置好的皇后是否右冲突
palace[quee][column] = -1; //将此时的棋盘位置置为-1
place(quee+1); //然后去放下一个皇后
palace[quee][column] = 1; //若下一个皇后没有放置好,回溯后将之前的-1变为1,即此时的位置允许放皇后
}
column_num[quee] = temp; //返回列号
}
}
}
} //判断放置的位置与放置好的皇后是否有冲突
private static boolean judge(int quee) {
for(int ready = 0; ready < quee; ready++){ //用之前的皇后去检测
if(column_num[ready] == column_num[quee] || //是否在同一列
quee + column_num[quee] == ready + column_num[ready] || //是否在左对角线
quee - column_num[quee] == ready - column_num[ready]){ //是否在右对角线
return false;
}
}
return true;
}
}

蓝桥杯 基础训练 BASIC-27 2n皇后问题的更多相关文章

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

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

  2. 蓝桥杯试题 基础练习 2n皇后问题以及n皇后问题

    在学习2n皇后之前,我们应该认识一下n皇后问题: 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上.你的任务是,对于 ...

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

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

  4. [蓝桥杯][基础训练]2n皇后问题

    Description 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行.同一列或同一条对角线上,任意的两个白皇后都不在同一行 ...

  5. [蓝桥杯][基础训练]Huffuman树

    Description Huffman树在编码中有着广泛的应用.在这里,我们只关心Huffman树的构造过程. , p1, …, pn-1},用这列数构造Huffman树的过程如下:1. 找到{pi} ...

  6. java 蓝桥杯基础训练 回文数

    public class _8回文数 { //两种方法都可以 // public static void main(String[] args) { // String zheng ="&q ...

  7. [蓝桥杯][基础训练]Sine之舞

    Description 最近FJ为它的奶牛开设了数学分析课,FJ知道,若要学好这门课,必须有一个好的三角函数基本功. 所以他为奶牛们做了一个“Sine之舞”的游戏,寓教于乐,提高奶牛的计算能力. 不妨 ...

  8. [蓝桥杯][基础训练]FJ的字符串

    Description FJ在沙盘上写了这样一些字符串: A1 = “A” A2 = “ABA” A3 = “ABACABA” A4 = “ABACABADABACABA” … … 你能找出其中的规律 ...

  9. 蓝桥杯练习系统—基础练习 2n皇后问题

    问题描述 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后, 使任意的两个黑皇后都不在同一行.同一列或同一条对角线上,任意的两个白皇后都不在同一行. 同一列或 ...

随机推荐

  1. 【算法】fhqtreap初探

    NOIP回来就一直想着学平衡树...平衡树写久了调不出来真的会头脑发热.jpg 大概只写了几道题... fhqtreap是不需要旋转的平衡树,仅使用分裂合并,一样可以保持平衡树的性质,并且可以非常简单 ...

  2. 【codevs2333】&【BZOJ2002】弹飞绵羊[HNOI2010](分块)

    我其实是在codevs上看到它的题号后才去做这道题的...2333... 题目传送门:codevs:http://codevs.cn/problem/2333/ bzoj:http://www.lyd ...

  3. mongodb 的安装(Centor OS )

    1.下载地址 wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.4.2.tgz 2.解压.配置 tar zxvf mongodb ...

  4. Elasticsearch安装笔记

    下载安装包 wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.5.2.zip 开始执行bin/./el ...

  5. Liberty glance 新功能 healthcheck

    oslo.middleware‘s healthcheck http://specs.openstack.org/openstack/oslo-specs/specs/kilo/oslo-middle ...

  6. 【NOIP2014 普及组】螺旋矩阵

    [NOIP2014 普及组]螺旋矩阵 一.题目 [NOIP2014 普及组]螺旋矩阵 时间限制: 1 Sec  内存限制: 128 MB 提交: 18  解决: 0 [提交][状态][讨论版] 题目描 ...

  7. DataGrid合并单元格(wpf)

    在网上搜索wpf合并单元格,一直没搜索到,没办法,只能自己想办法搞定了.其实就是DataGrid套DataGrid,为了方便支持Column拖动,在合并的DataGridColumn那一列的Heade ...

  8. python中模块的引用

    一. 模块的定义 定义 python模块(Module),是一个python文件,以.py结尾,包含了python对象定义和python语句.模块让你能够有逻辑地组织你的python代码段,把相关的代 ...

  9. 《Advanced Bash-scripting Guide》学习(八):从一个目录移动整个目录树到另一个目录

    本文所选的例子来自于<Advanced Bash-scripting Gudie>一书,译者 杨春敏 黄毅 ABS书上的例子: 从一个目录移动整个目录树到另一个目录 #!/bin/bash ...

  10. lucene搜索之facet查询原理和facet查询实例——TODO

    转自:http://www.lai18.com/content/7084969.html Facet说明 我们在浏览网站的时候,经常会遇到按某一类条件查询的情况,这种情况尤以电商网站最多,以天猫商城为 ...