八皇后问题是一个以国际象棋为背景的问题:如何能够在8×8的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。如图所示:

问题关键在于每一列的皇后不能和其他列的皇后在同一行,同一斜线上(正斜线,反斜线均不可)。
public class Queen {
/**
* 累计方案
*/
public static int num = 0;
public static final int MAXQUEEN = 8;
/**
* 8列棋子每一列皇后位置 cols[0] = 0 ,cols[1] = 2;
*/
public static int [] cols = new int[MAXQUEEN];
/**
* 填第n列的皇后
* @param n
*/
public void getCount(int n){
//记录每次递归时当前列的每个方格是否可以放皇后
boolean [] rows = new boolean[MAXQUEEN];
//记录所有不能放的位置
for (int i = 0; i < n; i++) {
//当前列N的的棋子不能放在前面列i的棋子的所在行上
rows[cols[i]]=true;
//当前列N的棋子到前面列i的棋子的距离
int d = n - i;
//当前列不能放在前面列i的棋子的正斜线上
if(cols[i] - d >= 0){
rows[cols[i] - d] = true;
}
//当前列不能放在前面列i的棋子的反斜线上
if(cols[i] + d < MAXQUEEN){
rows[cols[i] + d] = true;
}
}
for (int i = 0; i < MAXQUEEN; i++) {
//已经放了皇后的列跳过
if(rows[i]){
continue;
}
//没有放便将位置存放在数组中
cols[n] = i;
if(n < MAXQUEEN - 1){
getCount(n+1);
}else{
//方案加1
num++;
printQueen();
}
//继续循环,重n列的不同位置再开始
}
}
public void printQueen(){
System.out.println("第"+num+"种方法:");
for (int i = 0; i < MAXQUEEN; i++) {
for (int j = 0; j < MAXQUEEN; j++) {
if(cols[j]==i){
System.out.print("o ");
}else{
System.out.print("+ ");
}
}
System.out.println();
}
}
public static void main(String[] args) {
Queen queen = new Queen();
queen.getCount(0);
}
}
以上就完成了八皇后问题的解法。
本文介绍了一种解决经典的八皇后问题的方法,通过递归算法在8×8的棋盘上放置八个皇后,确保任两个皇后不在同一行、列或斜线上。
1776

被折叠的 条评论
为什么被折叠?



