使用回溯方法解决八皇后问题:
/**
* 回溯法
* @author acer
*
*/
public class Queens {
final boolean available=true;
final int squares=4,norm=squares-1;
int[] positionInRow=new int[squares];
boolean[] column=new boolean[squares];
boolean[] leftDiagonal=new boolean[squares*2-1];
boolean[] rightDiagonal=new boolean[squares*2-1];
public Queens(){
for(int i=0;i<squares;i++){
positionInRow[i]=-1;
column[i]=available;
}
for(int i=0;i<2*squares-1;i++){
leftDiagonal[i]=rightDiagonal[i]=available;
}
}
public void printBoard(){
for(int row=0;row<squares;row++){
for(int col=0;col<squares;col++){
if(positionInRow[row]==col){
System.out.print("1");
}else{
System.out.print("0");
}
}
System.out.println();
}
}
/**
* 回溯法放置皇后
* @param row
*/
public void putQueen(int row){
for(int col=0;col<squares;col++){
if(column[col]==available&&leftDiagonal[row+col]==available&&rightDiagonal[row-col+norm]==available){
positionInRow[row]=col;
column[col]=!available;
leftDiagonal[row+col]=!available;
rightDiagonal[row-col+norm]=!available;
if(row<squares-1){
putQueen(row+1);
}
//回溯时取走皇后
column[col]=available;
leftDiagonal[row+col]=available;
rightDiagonal[row-col+norm]=available;
}
}
}
public static void main(String[] args) {
Queens queens=new Queens();
queens.putQueen(0);
queens.printBoard();
}
}