蓝桥杯Java 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.util.Scanner;

public class Demo02 {
	static int n;
	static int a[][];
	static boolean hei1[]; //代表黑棋子的列,右斜,左斜
	static boolean hei2[];
	static boolean hei3[];
	static boolean bai1[];//代表白棋子的列,右斜,左斜
	static boolean bai2[];
	static boolean bai3[];
	static boolean vis[][];//用于记录该地已经换了棋子
	static int sum = 0;
	public static void dfsHei(int k){ //先放黑的
		if(k == n) {
			dfsBai(0);//放完黑的再换白的
			return;
		}
		for (int i = 0; i < n; i++) {
			if(a[k][i]==1 && !vis[k][i] && !hei1[i] && !hei2[i-k+n] && !hei3[k+i]){//要满足皇后没有放,可以换,还有不能打架
				vis[k][i] = true;
				hei1[i] = hei2[i-k+n] = hei3[k+i] = true;	
				dfsHei(k+1);
				vis[k][i] = false;
				hei1[i] = hei2[i-k+n] = hei3[k+i] = false;
			}
		}
	}
	public static void dfsBai(int k){
		if(k == n) {
			sum++;
			return;
		}
		for (int i = 0; i < n; i++) {
			if(a[k][i]==1 && !vis[k][i] && !bai1[i] && !bai2[i-k+n] && !bai3[k+i]){
				vis[k][i] = true;
				bai1[i] = bai2[i-k+n] = bai3[k+i] = true;	
				dfsBai(k+1);
				vis[k][i] = false;
				bai1[i] = bai2[i-k+n] = bai3[k+i] = false;	
			}
		}
	}
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();
		a = new int[n][n];
		vis = new boolean[n][n];
		hei1 = new boolean [n];
		hei2 = new boolean [n*2+1];
		hei3 = new boolean [n*2+1];
		bai1 = new boolean[n*2];
		bai2 = new boolean[n*2+1];
		bai3 = new boolean[n*2+1];
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				a[i][j] = sc.nextInt();
			}
		}
		sum = 0;
		dfsHei(0);
		System.out.println(sum);
	}
}

发布了15 篇原创文章 · 获赞 5 · 访问量 1420
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览