Skip to content

Instantly share code, notes, and snippets.

@PandyYang
Created April 19, 2018 15:35
Show Gist options
  • Select an option

  • Save PandyYang/3e48f6f7ab0a89c8fc101b6bb63f56d8 to your computer and use it in GitHub Desktop.

Select an option

Save PandyYang/3e48f6f7ab0a89c8fc101b6bb63f56d8 to your computer and use it in GitHub Desktop.
public class Queen {
private final int size;//棋盘的大小
private int[] location;//皇后在棋盘上每行上的列的位置
private int[] colsOccupied;//皇后在棋盘上占据的列
private int[] cross1Occupied;//皇后在棋盘上占据的正对角线
private int[] cross2Occupied;//皇后在棋盘上占据的反对角线
private static int count;//解决方案的个数
private static final int STATUS_OCCUPIED=1;//占领状态
private static final int STATUS_OCCUPY_CANCELED = 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]);
}
//判断i,j位置是否被占领
private boolean isOccupied(int i,int j){
return (colsOccupied[j] == 1)
||(cross1Occupied[i-j+size-1]==1)
||(cross2Occupied[i+j]==1);
}
//如果flag为1,表示占领位置(i,j)
//如果是零,则表示取消占领的位置
private void setStatus(int i,int j,int flag){
colsOccupied[j] = flag;//占领或取消第j列
cross1Occupied[i-j+size-1] = flag;//占领或取消正对角线
cross2Occupied[i+j] = flag;//占领或者取消占领反对角线
}
//从第i列开始摆放皇后
public void place(int i){
for (int j = 0;j<size;j++)//在第i行分别尝试把皇后放在每一列上
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_CANCELED);
}
}
public void start(){
place(0);
}
public static void main(String[] args){
new Queen(8).start();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment