java-八皇后问题

问题表述为:在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
问题表述为:在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。

public  class Queen{
	public static void main(String[] args){

	Queenplace queen = new Queenplace();
	queen.place(0);//下标从0开始
	System.out.print("count= "+ queen.count);//记录有多少种摆法

	}
}

class Queenplace{
	
	int count = 0;//计数器
	int arr[] = new int[8];
	//思路分析:
	//1.棋盘可以看做是一个8x8的二维数组
	//我们这里创建一个1维数组来解决 下标i表示行号  arr[i]的数值表示列号
	
	public void place(int n){//2.创建放置方法:接收放置皇后的个数,也就是第几个。因为下标从0开始,接收第一个数值为0,但表示第一个皇后
		if(n==8){
			print_();//满足条件 打印
			return;//n=8则表示已经存在9个皇后 退出
	}
	for(int i= 0; i<8; i++){
		arr[n] = i;//假设第1个棋子放在第1行第1列(坐标是 (0,0))
		if(chick(n)){
			place(n+1);//判断方法成立 则开始放置第二个棋子 n+1
			}
		}
	}
	
	private boolean chick(int n){//3.判断此处是否能够放置棋子的方法
		//棋子不能在同一行,同一列,因为n每次递增,所以行不再比较
		//arr[i]的值代表列
		for(int i = 0; i<n; i++){//因为这里是比较棋子位的合理性,假设现在放置的是第2个棋子,那么现在只需要跟第一个棋子比较,如果是第n+1个棋子则表示与0-n个棋子依次比较,所以判断条件为:i<n
		
			if(arr[i] == arr[n] || Math.abs(n-i) == Math.abs(arr[n]-arr[i])){
			//arr[i]==arr[n]的解释:
			//这里的arr[n]表示的是第n+1个棋子的列号 (参数int n 接收的是n+1)
			//i从0开始遍历 arr[i]则表示第n+1个棋子之前的每个棋子占据的列号  
			//abs.Math(n-i) == abs.Math(arr[n]-arr[i])此行表示斜率的比较
			//最下面还有图文说明
			//因为游戏规则是 每个棋子之间 行,列,对角方向都不能在同一条直线
			//如果 第 n+1 个棋子 所在行的每一个位置都满足if(arr[i] == arr[n] || abs.Math(n-i) == abs.Math(arr[n]-arr[i]))的条件
			//则表示第n个棋子的位置有误 需要重新放置 第n+1个棋子因为最后一个位置满足条件进入这个if判断中 然后返回flase
			// 此时回溯到place()方法中的for循环中 i++ 重新尝试
				return false;
			}	
		}
		return true;//表示以上条件都没进入 则返回true 表示当前棋盘格可以放置
	}
	private void print_(){//打印方法
		count++;
		for(int i = 0; i<arr.length; i++){
			System.out.print(arr[i]+" ");
		}
		System.out.println();
	}
}	

在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
八皇后问题是一个经典的回溯算法问题,目标是在一个8x8的棋盘上放置8个皇后,使得每个皇后都不会互相攻击。下面是一个Java八皇后问题的解决方案: ```java public class EightQueens { private static final int SIZE = 8; // 棋盘大小 private static int[] queens = new int[SIZE]; // 皇后的位置 public static void main(String[] args) { solve(0); // 从第一行开始放置皇后 } private static void solve(int row) { if (row == SIZE) { // 所有皇后都已放置好 printQueens(); return; } for (int col = 0; col < SIZE; col++) { if (isValid(row, col)) { // 判断当前位置是否可以放置皇后 queens[row] = col; // 放置皇后 solve(row + 1); // 递归放置下一行的皇后 } } } private static boolean isValid(int row, int col) { for (int i = 0; i < row; i++) { if (queens[i] == col || queens[i] - col == i - row || queens[i] - col == row - i) { return false; // 判断是否与之前的皇后冲突 } } return true; } private static void printQueens() { for (int row = 0; row < SIZE; row++) { for (int col = 0; col < SIZE; col++) { if (queens[row] == col) { System.out.print("Q "); } else { System.out.print(". "); } } System.out.println(); } System.out.println(); } } ``` 这段代码使用了递归的回溯算法来解决八皇后问题。它通过遍历每一行的每一列,判断当前位置是否可以放置皇后,如果可以则继续递归放置下一行的皇后,直到所有皇后都放置好。在判断当前位置是否可以放置皇后时,需要检查与之前已放置的皇后是否有冲突。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值