算法-八皇后(最容易理解代码量最小)
public class TestEightQueen {
public static void main(String[] args) {
TestEightQueen queen = new TestEightQueen();
queen.getCount(0);
}
int num = 0;
int maxqueen = 8;
// 每一种可能性最终结果。假如是 0 3 5 7 4 6 8 2 即第一列一 行 二列三行 ……
int[] cols = new int[maxqueen];
/**
* 从0列开始 0,1,2,3列
*
* @param i
*/
private void getCount(int n) {
// 第n列0-7行 哪一行可以放皇后
boolean[] rows = new boolean[maxqueen];
for (int m = 0; m < n; m++) {
//每一列的位置,相对于之前的列只有三种情况下某些位置不可以放皇后
//第一种:同一行 cols[m]就是n之前从0开始已经放了皇后的位置
rows[cols[m]]=true;
//第二种情况正向斜对角(左上到右下) 右侧的行数就是cols[m]+d
//距离cols[m] 1行 就是1正好是列之差,即1=n-m; 距离两行就是n-m=2 所以d=n-m . 假如cols[m]=5 右下1是6 ;右下2是7 ;右下3是8,不存在
int d=n-m;
if(cols[m]+d<=maxqueen-1){
rows[cols[m]+d]=true;
}
//第二种情况反向斜对角 (右上到左下) 左侧的行数 cols[m]-d
//距离cols[m] 1行的右上位置是,右上一,即1=n-m;所以d=n-m . 假如cols[m]=5 右上1是4 ; 右上2是3;右上3是2
if(cols[m]-d>=0){
rows[cols[m]-d]=true;
}
}
//上面知道了每n列,即每一列,哪几行不能放置皇后 ,下面开始找皇后具体是第几行
for (int i = 0; i < maxqueen; i++) {
if (rows[i]) {
// true不放行,表示该列第i行不能放皇后,循环的后续不执行使用continue
continue;
}
//若该列第i行为false,下面继续执行,说明可以放皇后
cols[n] = i;//说明该列已经放置的皇后,但是7-i行还可以放皇后
if (n < maxqueen - 1) {
getCount(n + 1);
} else {
//n+1>=7时,说明0到7列已经放置了皇后
num++;
//打印
print();
}
}
}
private void print() {
System.out.println("第"+num+"种方案");
for (int i = 0; i < maxqueen; i++) {
for (int j = 0; j < maxqueen; j++) {
if(i==cols[j]){
System.out.print("0");
}else{
System.out.print("+");
}
}
System.out.println(" ");
}
}
}

浙公网安备 33010602011771号