回溯法求解8皇后问题

2020-07-05  本文已影响0人  YAOPRINCESS

结果

解法:92
调用次数:15720

0 4 7 5 2 6 1 3 
0 5 7 2 6 3 1 4 
0 6 3 5 7 1 4 2 
0 6 4 7 1 3 5 2 
1 3 5 7 2 0 6 4 
1 4 6 0 2 7 5 3 
1 4 6 3 0 7 5 2 
1 5 0 6 3 7 2 4 
1 5 7 2 0 3 6 4 
1 6 2 5 7 4 0 3 
1 6 4 7 0 3 5 2 
1 7 5 0 2 4 6 3 
2 0 6 4 7 1 3 5 
2 4 1 7 0 6 3 5 
2 4 1 7 5 3 6 0 
2 4 6 0 3 1 7 5 
2 4 7 3 0 6 1 5 
2 5 1 4 7 0 6 3 
2 5 1 6 0 3 7 4 
2 5 1 6 4 0 7 3 
2 5 3 0 7 4 6 1 
2 5 3 1 7 4 6 0 
2 5 7 0 3 6 4 1 
2 5 7 0 4 6 1 3 
2 5 7 1 3 0 6 4 
2 6 1 7 4 0 3 5 
2 6 1 7 5 3 0 4 
2 7 3 6 0 5 1 4 
3 0 4 7 1 6 2 5 
3 0 4 7 5 2 6 1 
3 1 4 7 5 0 2 6 
3 1 6 2 5 7 0 4 
3 1 6 2 5 7 4 0 
3 1 6 4 0 7 5 2 
3 1 7 4 6 0 2 5 
3 1 7 5 0 2 4 6 
3 5 0 4 1 7 2 6 
3 5 7 1 6 0 2 4 
3 5 7 2 0 6 4 1 
3 6 0 7 4 1 5 2 
3 6 2 7 1 4 0 5 
3 6 4 1 5 0 2 7 
3 6 4 2 0 5 7 1 
3 7 0 2 5 1 6 4 
3 7 0 4 6 1 5 2 
3 7 4 2 0 6 1 5 
4 0 3 5 7 1 6 2 
4 0 7 3 1 6 2 5 
4 0 7 5 2 6 1 3 
4 1 3 5 7 2 0 6 
4 1 3 6 2 7 5 0 
4 1 5 0 6 3 7 2 
4 1 7 0 3 6 2 5 
4 2 0 5 7 1 3 6 
4 2 0 6 1 7 5 3 
4 2 7 3 6 0 5 1 
4 6 0 2 7 5 3 1 
4 6 0 3 1 7 5 2 
4 6 1 3 7 0 2 5 
4 6 1 5 2 0 3 7 
4 6 1 5 2 0 7 3 
4 6 3 0 2 7 5 1 
4 7 3 0 2 5 1 6 
4 7 3 0 6 1 5 2 
5 0 4 1 7 2 6 3 
5 1 6 0 2 4 7 3 
5 1 6 0 3 7 4 2 
5 2 0 6 4 7 1 3 
5 2 0 7 3 1 6 4 
5 2 0 7 4 1 3 6 
5 2 4 6 0 3 1 7 
5 2 4 7 0 3 1 6 
5 2 6 1 3 7 0 4 
5 2 6 1 7 4 0 3 
5 2 6 3 0 7 1 4 
5 3 0 4 7 1 6 2 
5 3 1 7 4 6 0 2 
5 3 6 0 2 4 1 7 
5 3 6 0 7 1 4 2 
5 7 1 3 0 6 4 2 
6 0 2 7 5 3 1 4 
6 1 3 0 7 4 2 5 
6 1 5 2 0 3 7 4 
6 2 0 5 7 4 1 3 
6 2 7 1 4 0 5 3 
6 3 1 4 7 0 2 5 
6 3 1 7 5 0 2 4 
6 4 2 0 5 7 1 3 
7 1 3 0 6 4 2 5 
7 1 4 2 0 6 3 5 
7 2 0 5 1 4 6 3 
7 3 0 2 5 1 6 4 

完整代码

package com.nan.recursion;

/**
 * @author klr
 * @create 2020-07-05-22:57
 */

//回溯法求解8皇后问题
public class Queen8 {

    private int count=0;
    private int count1=0;
    private int maxSize = 8;
    private int[] chessBoard = new int[maxSize];

    public static void main(String[] args) {
        Queen8 queen8 = new Queen8();
        queen8.getResult(0);
        System.out.println();
        System.out.println("解法:"+queen8.getCount());
        System.out.println("调用次数:"+queen8.getCount1());
    }

    //求解
    public void getResult(int n){
        if (n == maxSize) {//n=8时,说明已经求解
            count++;
            print();
            return;
        }
        //相当于8个for循环
        for (int i = 0; i <maxSize; i++) {
            count1++;
            chessBoard[n]=i;
            if (judge(n)) {
                //不冲突时
                getResult(n+1);
            }
        }
    }

    //判断是否发生冲突
    //规则,皇后不能在同一行,不能在同一列,不能再同一对角线
    //n代表第几个皇后
    public boolean judge(int n) {
        //让第n个皇后与她前面所有的皇后进行比较
        for(int i=0;i<n;i++){
            //行不用判断,列判断:chessBoard[i]==chessBoard[n],对角线判断:Math.abs(n-i)==Math.abs(chessBoard[n]-chessBoard[i]
            if(chessBoard[i]==chessBoard[n]||Math.abs(n-i)==Math.abs(chessBoard[n]-chessBoard[i])){
                return false;
            }
        }
        return true;
    }

    //打印
    public void print(){
        for (int i : chessBoard) {
            System.out.print(i+" ");
        }
        System.out.println();
    }

    public int getCount() {
        return count;
    }

    public int getCount1() {
        return count1;
    }
}

上一篇 下一篇

猜你喜欢

热点阅读