本文主要是介绍八个皇后,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
<pre name="code" class="java">八皇后问题是十九世纪著名数学家高斯于1850年提出的。问题是:在8*8的棋盘上摆放8个皇后,使其不能互相攻击,即任意的两个皇后不能处在同意行,同一列,或同意斜线上。可以把八皇后问题拓展为n皇后问题,即在n*n的棋盘上摆放n个皇后,使其任意两个皇后都不能处于同一行、同一列或同一斜线上。
public class EightQueues {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 EightQueues(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++) {for (int j = 0; j < size; j++) {if (j == location[i])System.out.print('Q');elseSystem.out.print('.');}System.out.println();}}private boolean isOccupied(int i, int j)// 判断位置(i,j)是否被占领{return (colsOccupied[j] == STATUS_OCCUPIED)|| (cross1Occupied[i - j - 1 + size] == STATUS_OCCUPIED)|| (cross2Occupied[i + j] == STATUS_OCCUPIED);}private void setStatus(int i, int j, int flag)// 如果flag为1,表示占领位置(i,j),否则表示取消占领{location[i] = j;colsOccupied[j] = flag;// 宣布占领或取消占领第j列cross1Occupied[i - j - 1 + size] = flag;// 宣布占领或取消占领正对角线cross2Occupied[i + j] = flag;// 宣布占领或取消占领反对角线}public void place(int i)// 从第i行开始摆放皇后{for (int j = 0; j < size; j++)// 在第i行分别尝试把皇后放在每一列上{if (!isOccupied(i, j))// 判断该位置是否被占领{setStatus(i, j, STATUS_OCCUPIED);// 宣布占领位置(i,j)if (i < size - 1)place(i + 1);// 如果所有皇后没有摆完,递归摆放下一行的皇后else {count++;// 统计解决方案的个数printLocation();// 完成任务,打印所有皇后的位置}setStatus(i, j, STATUS_OCCUPY_CANCELED);// 回溯,撤销占领位置(i,j)}}}public void start() {place(0);// 从第0行开始放置皇后}public static void main(String[] args) {// TODO Auto-generated method stubnew EightQueues(8).start();}
}
这篇关于八个皇后的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!