有一个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();
}