public class Test1 {
/**
*八皇后問題:
* 有一個 8x8 的棋盤,希望往裏放 8 個棋子(皇后),每個棋子所在的行、列、對角線
* 都不能有另一個棋子。找到所有滿足這種要求的放棋子方式
*/
@Test
public void test1(){
cal8Queens(0);
}
int[] result = new int[8]; //存儲每個列的標號
//遞歸實現算法
public void cal8Queens(int row){
if(row == 8){
printArray(result);
return;
}
for(int column=0;column<8;column++){
if(isOk(row,column)){
result[row] = column;
cal8Queens(row+1);
}
}
}
//滿足 8 皇后的規則要求
public boolean isOk(int row,int column){
int leftCl = column-1;
int rightCl = column+1;
for(int i=row-1;i>=0;i--){
if(result[i] == column)
return false;
if(leftCl>=0&&result[i] == leftCl){ //判斷左上對角線是否滿足無棋子的要求
return false;
}
if(rightCl<8&&result[i] == rightCl){ //判斷右上對角線是否滿足無棋子的要求
return false;
}
leftCl--;
rightCl++;
}
return true;
}
public void printArray(int[] array){
int row = 0;
for(int a:array){
System.out.println((row++)+","+a);
}
System.out.println("-------------------------------------");
}
}
0,0
1,4
2,7
3,5
4,2
5,6
6,1
7,3