简单的回溯问题
这里n=8,即八皇后问题,可以修改
注释已经很详细了
注意:
int[] queens 代表着 ,比如:queens[4]=3 代表在第4列的第3行放置一个皇后
public class Queens {
static int sum;
static int[] queens;
static int n;
public static void main(String[] args) {
n = 8;
// 因为是从1开始的,所以数组大小应该是n+1
queens = new int[n + 1];
// 从摆第一个皇后开始
Queens(1);
System.out.println(sum);
}
public static void Queens(int t) {
// 说明已经摆了n个皇后,即一个可行解
if (t > n) {
// 已经找到的可行解总数
sum++;
} else {
// 分别遍历放i→n行的情况
for (int i = 1; i <= n; i++) {
// 在第t列i行上放一个皇后
queens[t] = i;
// 如果可以放
if (canPlaced(t)) {
// 那么去下一列放置皇后
Queens(t + 1);
}
}
}
}
/**
* 判断在t上放置的皇后是否可行
*
* @param t
* @return
*/
public static boolean canPlaced(int t) {
// 遍历i→t-1列的皇后,与t列的皇后作比较
for (int i = 1; i < t; i++) {
// 前一个条件是不在同一行上
// 后一个条件是斜率不相等
if (queens[i] == queens[t]
|| Math.abs(t - i) == Math.abs(queens[i] - queens[t]))
return false;
}
return true;
}
}