有一個8x8的棋盤,希望往裏放8個棋子(皇后),每個棋子所在的行、列、對角線都不能有另一個棋子。
如下圖的樣子:
我們把這個問題劃分成8個階段,依次將8個棋子放到第一行、第二行、第三行……第八行。在放置的過程中,我們不停地檢查當前的方法,是否滿足要求。如果
滿足,則跳到下一行繼續放置棋子;如果不滿足,那就再換一種方法,繼續嘗試。
代碼如下:
public static int[] result=new int[8];
public static void main(String[] args) {
new T516_Queen().callBack(0);
}
public void callBack(int row){
if(row==8){
//打印result
this.printQueens(result);
return;
}
for (int column = 1; column < 9; column++) {
if(isOk(row,column)){
result[row]=column;
callBack(row+1);
}
}
}
public boolean isOk(int row,int column){
int left=column-1;
int right=column+1;
for(int j=row-1;j>-1;j--){
//上邊有
if(result[j]==column){
return false;
}
//左上角有
if(result[j]==left){
return false;
}
//右上角有
if(result[j]==right){
return false;
}
left--;
right++;
}
return true;
}
public void printQueens(int[] result){
for (int row = 0; row < 8; ++row) {
for (int column = 1; column < 9; ++column) {
if (result[row] == column) System.out.print("Q ");
else System.out.print("* ");
}
System.out.println();
}
System.out.println();
}