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);}}