八皇后
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了八皇后相关的知识,希望对你有一定的参考价值。
- package endual;
- public class Queen {
- private final int size = 8; // 棋盘的大小
- private int[] location ; //皇后在棋盘上的每一行的列的位子
- private int[] colsOccupied ; //皇后在棋盘上占据的列
- private int[] cross1Occuptied ; //皇后在棋盘上占据的正对角线
- private int[] cross2Occuptied ; //皇后在棋盘上占据的是反对角线
- private static int count ; //解决的方法的个数
- private static final int STATUS_OCCUPIED = 1 ; //占据的状态
- private static final int STATUS_OCCUPY_CANCELED = 0 ; //没有占据的状态
- public Queen() {
- this.location = new int[this.size];
- this.colsOccupied = new int[this.size];
- this.cross1Occuptied = new int[2*this.size];
- this.cross2Occuptied = new int[2*this.size];
- }
- public void printLocation() {
- System.out.println("以下是皇后在棋盘上的第" +count+"种方式的摆放");
- for (int i=0; i <this.size; i++) {
- System.out.println("行:" + i + " 列:" + this.location[i]) ;
- }
- } //end 打印
- /*判断位子(i,j)是否被占领了*/
- private boolean isOccupied(int i, int j) {
- if(this.colsOccupied[j] == 1) {
- return true ;
- }
- if(this.cross1Occuptied[i-j+this.size-1] == 1) {
- return true ;
- }
- if (this.cross2Occuptied[i+j] == 1) {
- return true ;
- }
- return false ;
- }
- /**
- * 如果flag为1,表示占领位子(i,j);
- * 如果flag为0,表示取消占领位子(i,j) ;
- */
- private void setStatus(int i, int j, int flag){
- this.colsOccupied[j] = flag ; //宣布占领或者是取消占领第j列
- this.cross1Occuptied[i-j+this.size-1] = flag ; //宣布占领或者取消占领正对角线
- this.cross2Occuptied[i+j] = flag ; // 宣布占领或取消占领反对角
- }
- /**第一行开始摆放皇后**/
- public void place(int i) {
- for (int j=0; j < this.size; j++) { //在第i行尝试把皇后放在每一列
- if (!this.isOccupied(i, j)) { //判断该位子是不是已经被占领了的
- this.location[i] = j ; //摆放皇后,在第i行把皇后放在第j列
- this.setStatus(i, j, this.STATUS_OCCUPIED) ; //已经被占领了的
- if (i < this.size-1) {
- this.place(i+1) ;
- }else {
- this.count++ ;
- this.printLocation() ;
- }
- //回溯法
- this.setStatus(i, j, STATUS_OCCUPY_CANCELED) ;
- }
- }
- }
- public void start() {
- this.place(0) ;
- }
- }
以上是关于八皇后的主要内容,如果未能解决你的问题,请参考以下文章