蓝桥杯 基础练习 2n皇后

import java.util.Scanner;
public class TwonQueen {
	static int[][] arrays; //棋盘
	static int n; //棋盘
	static int count; //次数
	// 可以不使用数组下面有另一种
	static int[][]queen; //queen占的平移到一行来判断是否同一列
	public static void main(String[] args) {
		Scanner inScanner  = new Scanner(System.in);
		n=inScanner.nextInt();
		arrays= new int[n][n];
		queen = new int[2][n];
		for (int i = 0; i < arrays.length; i++) {
			for (int j = 0; j < arrays.length; j++) {
				arrays[i][j]=inScanner.nextInt();
			}
		}
		long startTime = System.currentTimeMillis();
		//0为不能放 1为可以放 2为黑皇后 3为白皇后
		Queen(0,2);//从 0,0开始
		long endTime = System.currentTimeMillis();
		System.out.println(count);
		System.out.println(endTime-startTime+"ms");
	}
	static void Queen(int line, int type)
	{

		if(line==n) //n超出棋盘 说明满足;
		{
			if(type == 2)
			{
				Queen(0, 3);//白queen
			}
			else {
				count++; //一次
			}
			return;
		}
		for (int i = 0; i < n; i++) {
			if(arrays[line][i]!=1)
			{
				continue;
			}
			if(Check(type,line,i)) // 类型 行 列
			{
				arrays[line][i] = type;
				queen[type-2][i] = 1;
			}else {
				continue;
			}
			Queen(line+1, type);
			arrays[line][i]=1;//改会原来的棋盘
			queen[type-2][i]=0; //去掉该列的棋子
		}
		
	}
	static boolean Check(int type,int line, int col)
	{
		if(line==0)
		{
			return true;
		}
		// 判断同列有没有
		if (queen[type-2][col]==1) {
			return false;
		}
		/**
		* 不使用数组就注释掉与数组有关的代码
		* 去掉下面的注释
		*/
//		for (int i = line-1; i>=0; i--) {
//			if(arrays[i][col]==type)
//			{
//				return false;
//			}
//		}
		//左上
		for (int i = line-1, w = col-1; i>=0&&w>=0;i--,w--) {
			if(arrays[i][w]==type)
			{
				return false;
			}
		}
		//右上
		for (int i = line-1,w = col+1; i>=0&&w<=(n-1);i--,w++) {
			if(arrays[i][w]==type)
			{
				return false;
			}
		}
		return true;
	}
}

你可能感兴趣的:(划水摸鱼)