八皇后问题
来源:互联网 发布:cpda数据分析师培训 编辑:程序博客网 时间:2024/05/16 15:48
import java.util.*;/** * 八皇后问题 * @author oracs * @date 2008-06-04 */public class EightQueens { private static final int N = 8; private int[] queen = new int[N]; private int count = 0; // constructor public EightQueens() { for (int i = 0; i < N; i++) { queen[i] = -1; } } /** * @param args */ public static void main(String[] args) { EightQueens q = new EightQueens(); q.findQueen(0); } public boolean isQueenAtChest(int i, int j) { boolean result = false; if (j == 0) { // init queen array queen[0] = i; return true; } else { // loop queen array, find whether the next queen is in the right positon for (int queen_col = 0; queen_col < queen.length; queen_col++) { int queen_row = queen[queen_col]; if ( queen_row != -1) { if ( (i == queen_row) // 同一横线 ||((i >= queen_row) && (i == j + (queen_row - queen_col))) // 主对角线 ||((i < queen_row) && (i == (queen_row + queen_col) - j))) { // 斜对角线 return false; } } if (queen_col == queen.length - 1) { queen[j] = i; return true; } } } return result; } public void findQueen(int col) { if (col < N) { // loop every row in col for (int row = 0; row < N; row++) { if (isQueenAtChest(row, col)) { // recursion findQueen(col+1); } } // print the queen if (col == N - 1) { printQueen(); } // clear queen clearQueen(col); } } // print queen public void printQueen() { for (int i = 0; i < queen.length; i++) { if (queen[i] == -1) return; } System.out.println(++count +":" + Arrays.toString(queen)); } // initial -1 to queen 's back position public void clearQueen(int col) { for (int i = col; i < N; i++) { queen[i] = -1; } }}