八皇后问题
八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法.
分析
由于使用循环会存在多层,比较繁杂,这里使用递归dfs(深度优先搜索)解决
结束条件:
x == HEIGHT//所有行已填充(数组从0开始计数)
合法条件:
x行y列:前x-1行 使用for循环进行判断即可
a[i][j] == 1 && ((x - i) == Math.abs(y - j) || x == i || y == j)
代码
static final int HEIGHT = 8;
static final int WIDTH = 8;
static int a[][] = new int[HEIGHT][WIDTH];
static int sum = 0;
public static void main(String[] args) {
dfs(0);
System.out.println(sum);
}
public static void dfs(int x) {
if (x == HEIGHT) {
sum++;
return;
}
for (int j = 0; j < WIDTH; j++) {
if (check(x, j)) {
// 试探
a[x][j] = 1;
dfs(x + 1);
// 回溯
a[x][j] = 0;
}
}
}
/**
* 判断当前点的合法性
*
* @param x
* @param y
* @return
*/
public static boolean check(int x, int y) {
for (int i = 0; i < x; i++) {
for (int j = 0; j < WIDTH; j++) {
if (a[i][j] == 1 && ((x - i) == Math.abs(y - j) || x == i || y == j)) {
return false;
}
}
}
return true;
}