public class Queen {
protected int num = 8; // the number of queens
// chessboard索引表示行,即第几个queen,chessboard[i]=value,表示第i+1个queen,位于value+1列
int[] chessboard = new int[num];
private static int count = 0; // 记录多少种摆法
public void lay(int n) { // n表示放置第几个queen,从0开始
/*
n==8时,8个queen已就绪,lay返回,回溯到第8个queen(即第8行),往第八行的下一列继续放置
当for(int i = 0; i< num; ++i)结束时,表明第8行所有列已经(此时n==7)尝试完毕,继续回溯至n==6,
即第7行,往第7行的下一列继续尝试(for循环),继续进入n==7的所有i遍历,直至回溯到n==0(第一行)
*/
if (n == num) {
print();
return;
}
for (int i = 0; i < num; ++i) {
chessboard[n] = i; // 将第n+1行的queen至于第i+1列
if (feasible(n)) { // feasible会引用当前queen的列数,即chessboard[n]的值
lay(n + 1); // 当前queen与前面的queen不冲突
}
}
}
/**
* diagonal有双向,Math.abs(行差) == Math.abs(列差)即diagonal,行差即chessboard索引差,列差即
* chessboard对应的值差
*
* @param n n+1行的queen
* @return boolean
*/
public boolean feasible(int n) { // n 第n+1行queen
for (int i = 0; i < n; ++i) {
if (chessboard[i] == chessboard[n] || (n - i) == Math.abs(chessboard[n] - chessboard[i])) {
return false;
}
}
return true;
}
/**
* 找到一种摆法,打印,counter++
*/
public void print() {
count++;
for(int i=0;i<num;++i){
System.out.print(chessboard[i]+" ");
}
System.out.println();
}
public static void main(String[] args){
Queen queen=new Queen();
queen.lay(0); // 从第1行放置queen
System.out.println("count: "+count);
}
}
class Queen {
private int counter;
private static final int[] chessboard = new int[8];
protected void lay(int row) {
if (row == 8) {
print();
return;
}
for (int i = 0; i < 8; i++) {
chessboard[row] = i;
if (feasible(row)) {
lay(row + 1);
}
}
}
private boolean feasible(int row) {
for (int i = 0; i < row; ++i) {
if (chessboard[i] == chessboard[row] || row - i == Math.abs(chessboard[row] - chessboard[i])) {
return false;
}
}
return true;
}
private void print() {
counter++;
System.out.println("Solution = " + counter);
for (int i : chessboard) {
for (int v = 0; v < 8; ++v) {
System.out.print(v == i ? '$' : '*');
}
System.out.println();
}
}
}