public class Queen {
private final int size;
private int[] location;
private int[] colsOccupied;
private int[] cross1Occupied;
private int[] cross2Occupied;
private static int count = 0;
private static final int STATUS_OCCUPIED = 1;
private static final int STATUS_OCCUPY_CANCELLED = 0;
public Queen(int size){
this.size = size;
location = new int[size];
colsOccupied = new int[size];
cross1Occupied = new int[2*size];
cross2Occupied = new int[2*size];
}
public void printLocation(){
System.out.println("以下是皇后在棋盘上的第"+count+"种摆放位置");
for(int i = 0;i < size;i++)
System.out.println("行:"+i+"列:"+location[i]);
}
private boolean isOccupied(int i,int j){
return (colsOccupied[j] == STATUS_OCCUPIED)
||(cross1Occupied[i-j+size-1] == STATUS_OCCUPIED)
||(cross2Occupied[i+j] == STATUS_OCCUPIED);
}
private void setStatus(int i,int j,int flag){
colsOccupied[j] = flag;
cross1Occupied[i-j+size-1] = flag;
cross2Occupied[i+j] = flag;
}
public void place(int i){
for(int j = 0;j < size;j++)
if(!isOccupied(i,j)){
location[i] = j;
setStatus(i,j,STATUS_OCCUPIED);
if(i < size -1)
place(i + 1);
else{
count++;
printLocation();
}
setStatus(i,j,STATUS_OCCUPY_CANCELLED);
}
}
public void start(){
place(0);
}
public static void main(String[] args){
new Queen(10).start();
}
}