首页 > 其他分享 >递归之八皇后问题

递归之八皇后问题

时间:2022-10-08 09:37:41浏览次数:55  
标签:arr return 递归 同一 之八 斜线 int 皇后

八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在 8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即:任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法(92)。

思路

  • 将第一个皇后放在第一行第一列

  • 将第二个皇后放在第二行第一列,判断是否会和其他皇后相互攻击,若会相互攻击,则将其放到第三列、第四列…知道不会相互攻击为止

  • 将第三个皇后放在第三行第一列,判断是否会和其他皇后相互攻击,若会相互攻击,则将其放到第三列、第四列…知道不会相互攻击为止,并以此类推在摆放的过程中,有可能会改动前面所放的皇后的位置

  • 当得到一个正确的解时,就会回溯到上一行,由此来找出第一个皇后在第一行第一列的所有解

  • 再将第一个皇后放到第一行第二列,并重复以上四个步骤

  • 注意

    • 棋盘本身应该是用二维数组表示,但是因为皇后所在的行数是固定的,所以可以简化为用一个一维数组来表示。其中的值代表皇后所在的列
    • 数组下标代表皇后所在行数,所以判断是否在同一行列斜线上时,只需要判断是否在同一列和同一斜线上即可
      • 是否同列判断:值是否相同
      • 是否同一斜线:行号-行号是否等于列号-列号,且列号相减要取绝对值

代码

public class Queen8 {
    int max = 8;
    int[] arr = new int[max];
    static int count = 0;
    public static void main(String[] args) {
        Queen8 queen8 = new Queen8();
        queen8.check(0);
        System.out.printf("一共有%d种解法",count);
    }

    /**
     * 检查该皇后应放的位置
     * @param n 要检查的皇后
     */
    private void check(int n){
        if (n == max){//所有的皇后都放好了,打印并返回
            print();
            return;
        }
        //把皇后放在每一列上,看哪些不会和之前的冲突
        for (int i = 0; i < max; i++){
            //把第queen+1个皇后放在第i列
            arr[n] = i;
            if (judge(n)){
                //不冲突,就去放下一个皇后
                check(n + 1);
            }
        }
    }

    /**
     * 判断该位置的皇后与前面几个是否冲突
     * @param n 需要判断的皇后的位置
     * @return true代表不冲突,false代表冲突
     */
    private boolean judge(int n){
        for (int i = 0; i < n; i++){
            //如果两个皇后在同一列或者同一斜线,就冲突
            //因为数组下标代表行数,所以不会存在皇后在同一行
            //所在行数-所在行数 如果等于 所在列数-所在列数,则两个皇后在同一斜线上
            if (arr[n] == arr[i] || (n - i) == Math.abs(arr[n] - arr[i])){
                return false;
            }
        }
        return true;
    }

    /**
     * 打印数组元素
     */
    private void print(){
        count++;//count每加一次说明多了一种解法
        for (int i = 0; i < arr.length; i++){
            System.out.print(arr[i]+" ");
        }
        System.out.println();
    }
}

  这里仅测试了最后一种解法,发现没有问题

 

标签:arr,return,递归,同一,之八,斜线,int,皇后
From: https://www.cnblogs.com/wyh518/p/16767952.html

相关文章

  • fibnacci数列递归实现
    1.斐波那契数列(Fibonaccisequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(LeonardoFibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2......
  • 2022牛客国庆集训派对day6 C 递归构造 归纳构造
    给出一个m你需要构造出来m个m维向量两两向量之间点乘为0向量每一维只能是1或-1保证m一定是2的幂次。直接构造出来那么大的显然不太可能发现不了什么比较好的规律。......
  • 递归特征金字塔+可切换空洞卷积提升目标检测性能(附框架源码)
    “计算机视觉研究院”计算机视觉研究院专栏作者:Edison_G许多现代的目标检测器通过两次look和think的机制表现出优异的性能。 今天分享的是在目标检测的主干设计中探讨了这......
  • 路由高级特性-路由递归、等价路由
    一、路由递归先来看一个简单的示例在如图示拓扑中,RTA需要访问30.1.2.0/24网段,如果在RTA中配置静态路由iproute-static30.1.2.0255.255.255.020.1.1.2但注意观察,在路由表......
  • fibnacci数列递归实现
    fibnacci数列递归实现什么是fibnacci数列斐波那契数列(Fibonaccisequence),又称“黄金分割”数列,因数学家莱昂纳多·斐波那契(LeonardoFibonacci)以兔子繁殖为例子而引入,故......
  • 递归的概念以及迷宫问题
    1、概念递归就是方法自己调用自己,每次调用时传入不同的变量.递归有助于编程者解决复杂的问题,同时可以让代码变得简洁。并且递归用到了虚拟机栈2、能解决的问题数学问......
  • Fibnacci数列递归实现
    1.什么是Fibnacci数列?斐波那契数列(Fibonaccisequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(LeonardoFibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指......
  • 对于函数递归的理解
    递归的代码操作就是在自己未完成的函数之中调用自己这样看起来是并不合理的,因为在一个为完成的东西之中使用他自己,是不太现实的但是如果从代码执行的逻辑来进行理解的话,......
  • 算法竞赛备赛之浅谈递归
    递归递归需要有基例、递归前进段和递归返回段(return语句),是一种程序设计技巧,可以使程序编写简单,但实际上要付出低效率的代价计算时间复杂度常用数据的记忆(程序设计基本功,......
  • 程序员必备的基本算法:递归详解
    前言递归是一种非常重要的算法思想,无论你是前端开发,还是后端开发,都需要掌握它。在日常工作中,统计文件夹大小,解析xml文件等等,都需要用到递归算法。它太基础太重要了,这也是为......