蓝桥杯:试题 基础练习 2n皇后问题

试题描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码实现

import java.util.Scanner;
public class Main {
    
	static int count = 0;//记录总数
	static int max = 0; //棋盘大小
	static int[] white = null;//存放白皇后
	static int[] black = null;//存放黑皇后
	static int[][] arr = null;//棋盘初始化
	
	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		max = sc.nextInt();
		white = new int[max];
		black = new int[max];
		arr = new int[max][max];
		for (int i = 0; i < max; i++) {
			for (int j = 0; j < max; j++) {
				arr[i][j] = sc.nextInt();
			}
		}
		putWhite(0);
		System.out.println(count);
		
	}
	
	/**
	 * 放置白皇后
	 * @param n
	 */
	public static void putWhite(int n) {
		
		if(n == max) {//白皇后已放完
			putBlock(0);//开始放黑皇后
			return;
		}
		for (int i = 0; i < max; i++) {
			if(arr[n][i] == 1) {//判断此位置是否能放置皇后
				white[n] = i;//将第n个皇后放置到位置i(i列)
			}else {
				continue;//此位置不能放,结束本次循环,放置到下一列
			}
			if(judgeW(n)) {//检查冲突
				putWhite(n+1);//递归放下一个皇后
			}
		}
	}
	/**
	 * 放置黑皇后
	 * @param m
	 */
	public static void putBlock(int m) {
		
		if(m == max) {
			count++;
			return;
		}
		for (int i = 0; i < max; i++) {
			if(arr[m][i] == 1 && i != white[m]) {
				black[m] = i;
			}else {
				continue;
			}
			if(judgeB(m)) {
				putBlock(m+1);
			}
		}
	}
	
	/**
	 * 判断白皇后是否冲突
	 * @param n
	 * @return
	 */
	public static boolean judgeW(int n) {
		for (int i = 0; i < n; i++) {
			if(white[i] == white[n] || Math.abs(n-i) == Math.abs(white[n] - white[i])) {
				return false;
			}
		}
		return true;
	}
	
	/**
	 * 判断黑皇后是否冲突
	 * @param m
	 * @return
	 */
	public static boolean judgeB(int m) {
		for (int i = 0; i < m; i++) {
			if(black[i] == black[m] || Math.abs(m-i) == Math.abs(black[m] - black[i])) {
				return false;
			}
		}
		return true;
	}
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值