递归和回溯解决八皇后问题

一、题目

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

二、思路

使用递归和回溯解决该问题,并将结果保存到长度为8的一维数组中。比如:[7, 3, 0, 2, 5, 1, 6, 4],意思是在8*8的棋盘上,第一行的棋子放在第7列,第二行的棋子放在第3列,第三行的棋子放在第2列以此类推。

三、源代码

package recursion;

import java.util.Arrays;

public class Queen8 {
	
	static int count = 0; 			//用于计算,统计有多少种可能的结果
	static int max = 8; 					// 棋盘大小(全局变量) 
	static int[] chessBoard = new int[max]; // 棋盘(全局变量)

	public static void main(String[] args) {
		recurse(0);
	}
	
	/*
	 * 1. 打印八皇后每一种可能的结果
	 */
	public static void print() {
		System.out.printf("第%d种可能的结果:  " + Arrays.toString(chessBoard) + "\n", count);
	}
	
	
	/*
	 * 2. 检查后面的象棋是否与前面的存在冲突,比如在同一列,或者某两个在对角线上
	 */
	public static Boolean checkValidity(int index) {
		for(int j=0;j<index;j++) {
			// 如果在 同一列 或者在 对角线 上
			if(chessBoard[j]==chessBoard[index] 
					|| Math.abs(chessBoard[index] - chessBoard[j]) == Math.abs(index-j)) {
				return false;
			}
		}
		
		return true;
	}
	
	/*
	 * 3. 运用递归和回溯实现打印所有可能的八皇后结果
	 */
	public static void recurse(int num) {
		
		// 如果到了最后一步
		if(num == max) {
			count++;
			print();
			return;
		}
		
		for(int k=0;k<max;k++) {
			chessBoard[num] = k;
			
			// 如果符合条件,就递归下去
			if(checkValidity(num)) {
				recurse(num+1);
			}
			
			// 如果不符合条件,就继续for循环
		}
		
	}
}

四、结果

递归和回溯解决八皇后问题_第1张图片

你可能感兴趣的:(java数据结构,递归和回溯解决八皇后问题,递归解决八皇后问题,回溯解决八皇后问题,八皇后问题,八皇后)