Created
April 19, 2018 15:35
-
-
Save PandyYang/3e48f6f7ab0a89c8fc101b6bb63f56d8 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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