问题描述:
八皇后问题,是一个古老而著名的问题,是回溯算法的典型例题。该问题是十九世纪著名的数学家高斯1850年提出:
在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上(斜率为1),问有多少种摆法。高斯认为有76种方案。
让我们来举个栗子,下图的绿色格子是一个皇后在棋盘上的“封锁范围”,其他皇后不得放置在这些格子:
题解:
public class Practice_n皇后问题 {
static int n;//表示列数,行数
static int[] rec;
static int cnt;
public static void main(String[] args) {
n = 4;
rec = new int[4];
dfs(0);
System.out.println(cnt);
}
private static void dfs(int row) {
if (row == n) {
cnt++;
return;
}
//依次尝试在某一列上放皇后
for (int col = 0; col < n; col++) {
boolean ok = true;
//检验这个皇后是否和之前放的皇后有冲突
for (int i = 0; i < row; i++) {
if (rec[i] == col || (i - rec[i]) == (row - col) || (i + rec[i]) == (row + col)) {
ok = false;
break;
}
}
//这下面一步可以认为是剪枝操作
if (ok) {
rec[row] = col;//标记
dfs(row + 1);//继续寻找下一行
rec[row] = 0;//恢复原状
}
}
}
}