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;
    				}
    			}
    		}
    	}
    }
    

      

  • 相关阅读:
    day19(上)_IO流2(BufferedReaer,BufferedWriter,BufferedInputStream,BufferedOutputStream)
    day19(下)_IO流4(InputStreamReader,OutputStreamWriter,流操作规律总结)
    Synchronized锁 IT
    Linux查看端口信息命令 IT
    ReentrantLock锁 IT
    让网站实时生成多种电子书:jar、umd、chm、pdf、epub
    mysql性能的检查和调优方法
    新型的大型bbs架构(squid+nginx)
    uchome中的防反复提交机制
    joymobiler V2.7发布,支持pdf文档的生成
  • 原文地址:https://www.cnblogs.com/duanyingkui/p/8341751.html
Copyright © 2011-2022 走看看