package com.raylew.algorithm.book1; /* 八皇后问题 在8*8的棋盘上摆放8个皇后,使其不能互相攻击,即任意的两个皇后不能处在同意行,同一列,或同意斜线上。 可以把八皇后问题拓展为n皇后问题,即在n*n的棋盘上摆放n个皇后,使其任意两个皇后都不能处于同一行、同一列或同一斜线上。 */ public class 八皇后问题 { //皇后数目 public static int n = 8; //结果总数 public static int total = 0; //col[n]=x表示第n列的x行放置了皇后 public static int[] col = new int[n]; public static void main(String[] args) { dfs(0); System.out.println(total); } /** * dfs算法 * * @param cur 当前dfs遍历的行 */ public static void dfs(int cur) { if (cur == n) { total++; } else { int i = 0, j = 0; for (i = 0; i < n; i++) {// 遍历n列 boolean ok = true; col[cur] = i; for (j = 0; j < cur; j++) {// 遍历之前已经放置皇后的行,查看皇后放在第i列是否满足 if (col[cur] == col[j] || (cur - col[cur]) == (j - col[j]) || (cur + col[cur]) == (j + col[j])) { ok = false; break; } } if (ok) { dfs(cur + 1); } } } } }