N_Queens

来源:互联网 发布:java if else语句格式 编辑:程序博客网 时间:2024/04/30 03:22
/**  * Project Name:N_Queens  * File Name:N_Queens.java  * Package Name:  * Date:2013年11月3日 下午12:24:59  * Copyright (c) 2013, All Rights Reserved.  *  *//**  * ClassName:N_Queens <br/>  * Function: TODO ADD FUNCTION. <br/>  * Reason:   TODO ADD REASON. <br/>  * Date:     2013年11月3日 下午12:24:59 <br/>  * @author     * @version    * @since    JDK 1.6  * @see        */public class N_Queens {// 皇后的个数private int queensNum = 4;// column[i] = j 表示第 i 列的第 j 行放置一个皇后 private int[] queens = new int[queensNum + 1];// rowExists[i] = true 表示第 i 行有皇后  private boolean[] rowExists = new boolean[queensNum + 1];// a[i] = true 表示右高左低的第 i 条斜线有皇后  private boolean[] a = new boolean[queensNum * 2];// b[i] = true 表示左高右低的第 i 条斜线有皇后  private boolean[] b = new boolean[queensNum * 2];public void init() {for (int i = 0; i < queensNum +1; i++) {rowExists[i] = false;}for (int i=0; i<queensNum *2; i++) {a[i] = b[i] = false;}}// 判断该位置是否已经存在一个皇后,存在则返回 true  public boolean isExists(int row, int col) {return (rowExists[row] || a[row + col -1] || b[queensNum + col - row]);}// 测试皇后的放置位置public void doIt(int column) {// 遍历每一行for (int row = 1; row<queensNum + 1; row++) {if(!isExists(row, column)) {// 设置第 row 行第 column 列有皇后   queens[column] = row;// 设设置以第 row 行第 column 列为交叉点的斜线不可放置皇后 rowExists[row] = a[row + column -1] = b[queensNum + column -row] = true;//当查找到最后一行的时候,就把结果打印出来if (column == queensNum) {for (int col=1; col<=queensNum; col++) {System.out.print("("+col + "," + queens[col] + ")  "); }System.out.println();  } else {// 当没有找到最底层的时候 递归去找下一行的皇后// 递归放置下一列皇后doIt(column +1);}// 撤销上一步所放置的皇后,即回溯  rowExists[row] = a[row + column - 1] = b[queensNum + column - row] = false;  }}}public static void main(String[] args) {  N_Queens queen = new N_Queens();        queen.init();       queen.doIt(1);}} 

原创粉丝点击