zoukankan      html  css  js  c++  java
  • 蓝桥杯java 基础练习 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
     
    import java.io.InputStreamReader;
    import java.util.Scanner;
    
    public class Main {
    	static int n, m, map[][], Count;
    	static boolean v[][], a[][], b[][];
    
    	public static void main(String[] args) {
    		Scanner sc = new Scanner(new InputStreamReader(System.in));
    		while (sc.hasNext()) {
    			n = sc.nextInt();
    			map = new int[n][n];
    			v = new boolean[n][n];
    			a = new boolean[3][2 * n];
    			b = new boolean[3][2 * n];
    			for (int i = 0; i < n; i++)
    				for (int j = 0; j < n; j++)
    					map[i][j] = sc.nextInt();
    			Count = 0;
    			dfs(0);
    			System.out.println(Count);
    		}
    	}
    
    	private static void dfs(int i) {
    		if (i == n) {
    			Count++;
    			return;
    		}
    		for (int j = 0; j < n; j++) {
    
    			if (!v[i][j] && map[i][j] != 0) {
    
    				if (!a[0][i + j] && !a[1][n + i - j] && !a[2][j]) {
    
    					v[i][j] = true;
    					a[0][i + j] = a[1][n + i - j] = a[2][j] = true;
    
    					for (int k = 0; k < n; k++) {
    						if (!v[i][k] && map[i][k] != 0) {
    
    							if (!b[0][i + k] && !b[1][n + i - k] && !b[2][k]) {
    
    								v[i][k] = true;
    								b[0][i + k] = b[1][n + i - k] = b[2][k] = true;
    								dfs(i + 1);
    								v[i][k] = false;
    								b[0][i + k] = b[1][n + i - k] = b[2][k] = false;
    
    							}
    						}
    					}
    					v[i][j] = false;// 注意放置的位置
    					a[0][i + j] = a[1][n + i - j] = a[2][j] = false;
    				}
    			}
    		}
    	}
    }
    

      

  • 相关阅读:
    Linux XOR.DDoS样本取证特征与清除
    利用Volatility对Linux内存取证分析-常用命令翻译
    【黑客免杀攻防】读书笔记14
    CertUtil.exe被利用来下载恶意软件
    利用rundll32执行程序的函数执行程序
    揭秘Patchwork APT攻击-恶意软件样本BADNEWS
    【CTF MISC】pyc文件反编译到Python源码-2017世安杯CTF writeup详解
    [ 总结 ] 删除通过find查找到的文件
    [ 脚本 ] RHEL6.x 及Centos6.x 初始化脚本
    [ 手记 ] 联想rd650服务器整列及系统安装
  • 原文地址:https://www.cnblogs.com/duanyingkui/p/8341751.html
Copyright © 2011-2022 走看看