N皇后代码简化至33行
八皇后问题:一个古老而著名的问题,是回溯算法的典型案例。该问题由国际西洋棋棋手马克斯·贝瑟尔于 1848 年提出:在 8×8 格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。高斯认为有 76 种方案。1854 年在柏林的象棋杂志上不同的作者发表了 40 种不同的解,后来有人用图论的方法解出 92 种结果。计算机发明后,有多种计算机语言可以编程解决此问题。
源代码:
import java.util.Arrays;
public class N_Queen {
static int N = 8, count = 0;
static int arr[][] = new int[N][N];
public static void main(String args[]) {
find(0);
}
static void find(int i) {
if (i == N) {
System.out.println(++count+":");
for (int k = 0; k < N; k++)
System.out.println(Arrays.toString(arr[k]));
}
for (int j = 0; j < N; j++)
if (check(i, j)) {
arr[i][j] = 1;
find(i + 1);
arr[i][j] = 0;
}
}
static boolean check(int i, int j) {
for (int x = 0; x < N; x++)
if (arr[x][j] == 1)
return false;
for (int x = i - 1, y = j - 1; x >= 0 && y >= 0; x--, y--)
if (arr[x][y] == 1)
return false;
for (int x = i - 1, y = j + 1; x >= 0 && y < N; x--, y++)
if (arr[x][y] == 1)
return false;
return true;
}
}
运行结果: