回溯算法最经典的八皇后问题:
注:打印的棋盘中“@”代表皇后棋子的位置。
public class Demo01 {
static boolean[][] queens = new boolean[8][8];
static boolean[][] entity = new boolean[8][8];
static int count = 0;
public static void main(String[] args) {
long time1 = System.currentTimeMillis();
dfs(0);
long time2 = System.currentTimeMillis();
System.out.println(count);
System.out.println(time2 - time1);
}
private static void dfs(int start) {
for(int i = 0; i < 8; i ++){
if(queens[start][i]){
continue;
}
entity[start][i] = true;
if(start == 7){
count ++;
//打印棋盘
print();
entity[start][i] = false;
continue;
}
change();
dfs(start + 1);
entity[start][i] = false;
}
}
/**
* 打印棋盘
*/
private static void print() {
for(int i = 0; i < 8; i ++){
for(int j = 0; j < 8; j ++){
if(entity[i][j]){
System.out.print("@ ");
continue;
}
System.out.print("* ");
}
System.out.println();
}
System.out.println();
}
private static void change() {
queens = new boolean[8][8];
for(int i = 0; i < 8; i ++){
for(int j = 0; j < 8; j ++){
if(entity[i][j]){
int sum = i + j;
int re = j - i;
for(int a = i; a < 8; a ++){
for(int b = 0; b < 8; b ++){
if(b == j || (a + b) == sum || (b - a) == re)
queens[a][b] = true;
}
}
}
}
}
}
}