八皇后问题 ,以及两个相似题

经典八皇后

import java.util.Arrays;
import java.util.Scanner;
public class Main08_0 {
	public static int max,count=0;//皇后个数
	public static int []arr;//皇后的位置表示 arr[i]:第i个皇后在arr[i]列
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		max=8;
		arr=new int[max];
		Check(0);
		System.out.println(count);
		
}

	public static void  Check(int n) {
		if (n==max) {//8个皇后都已经放好的情况,则输出
			System.out.println(Arrays.toString(arr));
			count++;
			return;
		}
		//依次放入皇后
		for (int i = 0; i <max; i++) {
			arr[n]=i;
			if (Judge(n)) {//不冲突
				Check(n+1);
			}
			//如果冲突,则将n皇后放到下一列
		}
	}
	
	//放置第n个皇后时,去检测是否与前面已经摆放的皇后冲突
	public static boolean Judge(int n) {
		for (int i = 0; i <n; i++) {
			//判断第n个皇后是否与之前皇后在同一列
			//Math.abs(n-i)==Math.abs(arr[n]-arr[i]) 判断第n个皇后是否与之前皇后在同一斜线
				//在同一斜线时,n-i==|arr[n]-arr[i]|
			if (arr[i]==arr[n]||n-i==Math.abs(arr[n]-arr[i])) {
				return false;
			}
		}
		return true;
	}
}

王、后传说 。这题需要在经典问题的判断基础上添加一个判断是否与国王所在范围发生冲突

问题描述
  地球人都知道,在国际象棋中,后如同太阳,光芒四射,威风八面,它能控制横、坚、斜线位置。
  看过清宫戏的中国人都知道,后宫乃步步惊心的险恶之地。各皇后都有自己的势力范围,但也总能找到相安无事的办法。
  所有中国人都知道,皇权神圣,伴君如伴虎,触龙颜者死…
  现在有一个n*n的皇宫,国王占据他所在位置及周围的共9个格子,这些格子皇后不能使用(如果国王在王宫的边上,占用的格子可能不到9个)。当然,皇后也不会攻击国王。
  现在知道了国王的位置(x,y)(国王位于第x行第y列,x,y的起始行和列为1),请问,有多少种方案放置n个皇后,使她们不能互相攻击。
输入格式
  一行,三个整数,皇宫的规模及表示国王的位置
输出格式
  一个整数,表示放置n个皇后的方案数
样例输入
8 2 2
样例输出
10

//八皇后·改
import java.util.Scanner;
public class Main08_1 {
	public static int max,maxVal=0;//皇后个数
	public static int []arr;//皇后的位置表示 arr[i]:第i个皇后在arr[i]列
	public static int [][]grid=new int[8][8];//棋盘格子
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		max=8;
		arr=new int[max];
		//输入棋盘上每个格子的数字
		for (int i = 0; i <max; i++) {
			for (int j = 0; j <max; j++) {
				grid[i][j]=sc.nextInt();
			}
		}
		Check(0);
		System.out.println(maxVal);
		
}
	//计算排列皇后的格子上数字的和
	public static int gridSum(int []arr) {
		int sum=0;
		for (int i = 0; i < arr.length; i++) {
			sum+=grid[i][arr[i]];
		}
		return sum;
	}
	
	public static void  Check(int n) {
		if (n==max) {//8个皇后都已经放好的情况,则输出
			maxVal=Math.max(maxVal,gridSum(arr));
			return;
		}
		//依次放入皇后
		for (int i = 0; i <max; i++) {
			arr[n]=i;
			if (Judge(n)) {//不冲突
				Check(n+1);
			}
			//如果冲突,则将n皇后放到下一列
		}
	}
	
	//放置第n个皇后时,去检测是否与前面已经摆放的皇后冲突
	public static boolean Judge(int n) {
		for (int i = 0; i <n; i++) {
			//判断第n个皇后是否与之前皇后在同一列
			//Math.abs(n-i)==Math.abs(arr[n]-arr[i]) 判断第n个皇后是否与之前皇后在同一斜线
				//在同一斜线时,n-i==|arr[n]-arr[i]|
			if (arr[i]==arr[n]||n-i==Math.abs(arr[n]-arr[i])) {
				return false;
			}
		}
		return true;
	}
}

八皇后·改 。这题需要输入格子的数字,在求出的皇后排列法方案基础上,把每个格子的数字相加,互相比较,取最大即可。

问题描述
  规则同8皇后问题,但是棋盘上每格都有一个数字,要求八皇后所在格子数字之和最大。
输入格式
  一个8*8的棋盘。
输出格式
  所能得到的最大数字和
样例输入
1 2 3 4 5 6 7 8
9 10 11 12 13 14 15 16
17 18 19 20 21 22 23 24
25 26 27 28 29 30 31 32
33 34 35 36 37 38 39 40
41 42 43 44 45 46 47 48
48 50 51 52 53 54 55 56
57 58 59 60 61 62 63 64
样例输出
260

//王、后传说
import java.util.Scanner;
public class Main08_2 {
	public static int max,x,y,count=0;//皇后个数,国王坐标(x,y)
	public static int []arr;//皇后的位置表示 arr[i]:第i个皇后在arr[i]列
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		max=sc.nextInt();//皇后个数
		x=sc.nextInt()-1;
		y=sc.nextInt()-1;
		arr=new int[max];
		Check(0);
		System.out.println(count);
}

	public static void  Check(int n) {
		if (n==max) {//8个皇后都已经放好的情况,则输出
			//System.out.println(Arrays.toString(arr));
			count++;
			return;
		}
		//依次放入皇后
		for (int i = 0; i <max; i++) {
			arr[n]=i;
			if (Judge(n)) {//不冲突
				Check(n+1);
			}
			//如果冲突,则将n皇后放到下一列
		}
	}
	
	//放置第n个皇后时,去检测是否与前面已经摆放的皇后冲突
	public static boolean Judge(int n) {
		for (int j = -1; j<=1; j++) {//皇上身边的行号
			for (int j2 = -1; j2 <=1; j2++) {//皇上身边的列号
				if (n==x+j&&arr[n]==y+j2) {//皇后在皇上身边的九个格子内
					return false;
				}
			}
		}
		for (int i = 0; i <n; i++) {
			//判断第n个皇后是否与之前皇后在同一列
			//Math.abs(n-i)==Math.abs(arr[n]-arr[i]) 判断第n个皇后是否与之前皇后在同一斜线
				//在同一斜线时,n-i==|arr[n]-arr[i]|
			if (arr[i]==arr[n]||n-i==Math.abs(arr[n]-arr[i])) {
				return false;
			}
		}
		return true;
	}
}

你可能感兴趣的:(蓝桥杯)