八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。
规则:
在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
思路:
- 构建二维数组,模拟棋盘
chess[r][c]=0表示:r行c列没有皇后,chess[r][c]=1表示:r行c列位置有一个皇后。 - 从第一行第一列开始逐行摆放皇后
依题意每行只能有一个皇后,遂逐行摆放。 - 摆放后立即调用一个验证函数(传递整个棋盘的数据),验证合理性
安全则进入下一行摆放下一个,不安全则尝试摆放这一行的下一个位置
1) 当这一行所有位置都无法保证皇后安全时,会退出在本行进的摆放方法,回退到上一行的摆放方法,并且在上一行的下一个位置进行摆放(回溯算法的核心)
当摆放到最后一行,并且调用验证函数确定安全后,输出结果、并累计成功数
2) 当最后一行8个位置遍历完成后,会退出本行的摆放方法,回退到上一行的摆放方法,并且在上一行的下一个位置进行摆放(回溯算法的核心) - 需要扫描当前摆放皇后的 左上,正上,右上 方向是否有其他皇后,有的话存在危险,没有则表示安全,并不需要考虑当前位置棋盘下方的安全性
/**
* @author Ziph
* @date 2020年2月24日
* @Email mylifes1110@163.com
*/
public class EightQueens {
private static int count = 0; //解法的计数器
public static void main(String[] args) {
//初始化棋盘,全部置为0
short chess[][] = new short[8][8];
for (int i = 0; i < 8; i