今天上课的时候老师讲到了回溯的经典问题–n皇后,我们老师用的例子是六皇后,先看下老师的课件,帮助理解。
核心思路有了,但是六皇后过于简单,课后我又总结了一下,加之我自己的理解,于是n皇后的算法就实现了,此算法如果是暴力求解的话是会超时的,所以我们用回溯加深搜来实现,下面上代码!!
Duang ~ Duang ~ Duang ~
package Test;
import java.util.Scanner;
public class Main {
// n皇后之八皇后
static int sum = 0;
static int a[] = new int[100];// 行
static int b[] = new int[100];// 列
static int c[] = new int[100];// 对角线
static int d[] = new int[100];// 对角线
// dfs与回溯
public static void Queen(int i, int n) {// i=1 n=8
if (i > n) {
sum++;
if (sum <= sum) { // 前n行
for (int k = 1; k <= n; k++) {
System.out.print(a[k] + " ");
}
System.out.println();
}
} else {
for (int j = 1; j <= n; j++) {
if (b[j] == 0 && c[i + j] == 0 && d[i - j + n] == 0) { // 其他皇后没有占领
a[i] = j; // i行j列安置皇后
b[j] = 1; // 纵列占领
c[i + j] = 1;
d[i - j + n] = 1; // 对角线占领
Queen(i + 1, n); // dfs
b[j] = 0;
c[i + j] = 0;
d[i - j + n] = 0;
// 复原回溯
}
} // for
}
}
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.print("输入样例:");
int n = input.nextInt();
Queen(1, n);
System.out.println("输出样例:" + sum);
}
}
结果:
六皇后
八皇后
OK,今日分享如上,周三快乐撒~~