八皇后问题代码实现以及思路讲解


问题描述

八八皇后问题(英文:Eight queens),是由国际西洋棋棋手马克斯·贝瑟尔于1848年提出的问题,是回溯算法的典型案例。
问题表述为:在8×8格的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。


一、解法思路

(1)第一个皇后先放置在第一行第一列,
(2)第二个皇后放置在 第二行第一列,判断是否ok,如果不行,则将皇后后移一个位置,依次把所有列尝试
(3)将剩下的皇后按照第二步依次放置,直到放置完最后一个皇后
(4)返回第一行,将第一个皇后往后放置一列,然后重复1,2,3,4操作

二、解决方法

判断皇后的位置运用一维数组。a[i]=n,i代表为第几个皇后,n则代表为多少列
i也同时代表为第几行,因为同行不能有两个皇后,说明皇后的个数也代表为行数

public class queen{
static int max=8;//定义皇后的数量
int []arr=new int[max];//定义一个以为数组来表述第几个皇后,和在第几列
int count=0;//用于记录共有多少中种方法
}

1.先定义一个函数解决如何判断皇后能否放置在这个位置

思想:因为只需要判断列是否相同以及是否在一条斜线上,斜线则通过判断行的差值和列的差值是否一样则可判断出(原理:等腰三角形)
在这里插入图片描述

/**
*n为传入的皇后数
*/
public static void judge(int n){
		for(int i=0;i<n;i++){//从第一个皇后开始判断
				if(arr[i]==arr[n]||Math.abs(i-n)==Math.abs(arr[i]-arr[n])){
					return false;
					}
		}
	return true;
	
}

2.向棋盘中添加元素

代码如下(示例):

/*
*	n为从第几个皇后开始
*/
public static void  check(int n){
	if(n==max){//当n等于最大值的时候,说明已经把最后的一个皇后放置,结束
		print();
		return ;
	}
	for(int i=0;i<max;i++){
		//将皇后从第一列开始放置
		arr[n]=i;
		if(judge()){//如果与其他皇后不冲突,则继续调用函数,添加皇后
		check(n+1);
		}
			//如果冲突了,则将皇后摆到下一列执行i++,arr[n]=i的代码
		}
}

3.对皇后的摆放位置进行一个遍历

代码如下(示例):

/*
*	打印皇后的摆放位置,因为只有当它到了最后一个皇后摆放才能打印,所以打印次数也就是为八皇后一共有的解法
*/
public void print(){
	count++;
	for(int i=0;i<arr.length;i++){
	System.out.print(arr[i]+" ");
	}
	System.out.println();
}


<hr style=" border:solid; width:100px; height:1px;" color=#000000 size=1">

# 总结
在思考八皇后的问题时候可以考虑树状思想,
实现算法的回溯是通过for(int i=0;i<max;i++)来实现的,新人小白,有问题请指出,谢谢
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值