package com.banban.algorithm; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class NQueenQuestion { //表格的数量 private int gridNumber; //解决方案的个数 private int co; //王后的位置 private int queensPlace[]; public static void main(String args[]){ BufferedReader reader = new BufferedReader( new InputStreamReader(System.in)); System.out.println("请输入棋盘的大小即N:"); String line = ""; try { line = reader.readLine(); } catch (IOException e) { e.printStackTrace(); } NQueenQuestion solve = new NQueenQuestion(Integer.parseInt(line)); solve.solve(0); } /** * 解决方案 * @param row */ public void solve(int row){ for(int col = 0; col < gridNumber; col++){ if(isSafe(row, col)){ queensPlace[row] = col; if(row == gridNumber -1) printQueensPlace(); //backtracking else solve(row + 1); } } } /** * 王后的位置是否安全 * 同一行和列只能有一个王后queensPlace[beforeRow] == col * 王后所处的位置的对角线不能有其它王后 * Math.abs(beforeRow - row) * == Math.abs(queensPlace[beforeRow] - col) * 推导过程 * beforeColumn即queensPlace[beforeRow] * * * 正斜线公式 * beforeRow + beforeColumn = row + col * 换算为 * beforeRow - row = col - beforeColumn * * * 反斜线公式 * beforeRow - beforeColumn = row - col * 换算为 * beforeRow - row = beforeColumn - col; * * 正反斜线的公式合并 * Math.abs(beforeRow - row) = Math.abs(beforeColumn - col) * @param row * @param col * @return */ public boolean isSafe(int row, int col){ for(int beforeRow = 0; beforeRow < row; beforeRow++){ if(queensPlace[beforeRow] == col || Math.abs(beforeRow - row) == Math.abs(queensPlace[beforeRow] - col)) return false; } return true; } /** * 打印王后位置 */ public void printQueensPlace(){ ++co; System.out.println("===========Arrangement No."+co+" ======================"); for(int row = 0; row < gridNumber; row++){ for(int col = 0; col < gridNumber; col++){ if(queensPlace[row] == col) System.out.print("\tQ"); else System.out.print("\t-"); } System.out.println(); } } public NQueenQuestion(int gridNumber){ this.gridNumber = gridNumber; this.queensPlace = new int[gridNumber]; } }
N皇后 Java 可运行
猜你喜欢
转载自blog.csdn.net/s15948703868/article/details/106648400
今日推荐
周排行