N皇后 Java 可运行

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

猜你喜欢

转载自blog.csdn.net/s15948703868/article/details/106648400