美文网首页
回溯法求解8皇后问题

回溯法求解8皇后问题

作者: YAOPRINCESS | 来源:发表于2020-07-05 23:48 被阅读0次

结果

解法: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;
    }
}

相关文章

  • 回溯法求解8皇后问题

    结果 解法:92调用次数:15720 完整代码

  • N皇后

    回溯法核心代码: n皇后问题回溯法

  • 回溯法初探(一)

    回溯法是的应用范围很广,主要用于数据量不是很大的暴力求解问题,比如"图的m着色问题","八皇后问题"。 ...

  • 51. N-Queens

    题目分析 N 皇后问题 + 回溯法 代码

  • 八皇后问题

    采用试探回溯策略,通过栈记录查找结果,实现八皇后问题求解。 测试代码

  • [算法] - 8皇后问题(回溯法)

    1. 问题 在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线...

  • LeetCode 51. N-Queens

    Leetcode : N-QueensDiffculty:Hard N皇后问题,对八皇后问题的扩展,典型的回溯法算...

  • 分支限界法

    分支界限法原理   分支限界法和回溯法是类似的问题求解方法。回溯法是通过深度优先的方式对问题进行探索性的解决,而分...

  • 暴力穷举和回溯法(八皇后问题)

    以前每次遇到算法问题都是直接暴力求解,一直以为自己用的是暴力穷举法,现在学了回溯法,发现部分问题其实使用的是回溯法...

  • 软件设计师考试 | 第八章 算法设计与分析 | 分支限界法

    分支限界法类似于回溯法,也是一种在问题的解空间树上搜索问题解的算法。 一般情况下,分支限界法与回溯法的求解目标不同...

网友评论

      本文标题:回溯法求解8皇后问题

      本文链接:https://www.haomeiwen.com/subject/tmfiqktx.html