首页 > 其他分享 >递归回溯法-八皇后问题

递归回溯法-八皇后问题

时间:2024-07-19 22:01:18浏览次数:14  
标签:arr 递归 同一 int 放置 回溯 皇后 摆法

一、问题描述

八皇后问题是回溯算法的典型案例。该问题由国际西洋棋手马克斯 • 贝瑟尔于1848年提出:

在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即:任意两个皇后不能处于同一行、同一列或同一斜线上,问有多少种摆法。通过计算可以得出共有92种摆法。

二、思路分析

由于规定两个皇后不能处于同一行,因此一种放置结果可以由对应的一个一维数组来表示(记所有索引都从0开始)。

如下图所示的可行解,对应数组即 [0,4,7,5,2,6,1,3],很直观,即第0行的皇后,放置在第0列;第1行的皇后放置在第4列...

Q
Q
Q
Q
Q
Q
Q
Q

在求解时,按照逐行逐列放置的思路。

由第0行的皇后开始放置,放置位置为 0~7 列;同样,第 i 行的皇后放置位置也为 0~7 列;

在放置第 i 行的皇后是否能放置在第 j 列时,需要依次判断是否与前 i-1 行的各个皇后相互攻击,如果都不攻击,即满足条件,则继续放置 i+1 行的皇后;否则,继续判断第 j+1 列的位置是都可行;

三、Java实现

// 八皇后问题,在一个8×8的国际象棋棋盘上摆放8个皇后,
// 摆放需遵守皇后不能处于同一行、同一列、同一斜线上,问有多少种摆法

// 由于不能处于同一行、说明每行只能放1个皇后
// 用一维数组 arr 表示一组皇后放置结果(索引从0开始)
// Eg,[0,4,7,5,2,6,1,3]表示第0行的皇后,放置在第0列;第1行的皇后放置在第4列...
// 问题等效于,找到一组符合条件的permute排列,通过回溯法求解。

public class EightQueen
{
    int count = 0;  //记录一共多少种解法
    int[] arr = new int[8];

    public static void main(String[] args)
    {
        EightQueen q = new EightQueen(); //创建一个类的对象 q
        q.putQueen(0); //棋盘为空,从第0行的皇后开始放
        System.out.println("count:"+q.count);
    }



    //判断第i个皇后是否能放在第j个位置
    public boolean verifyPos(int[] arr,int i,int pos)
    {
        for (int putAread = 0; putAread <i; putAread++)
            //在判断第i行的皇后是否能放置在第j列的位置时,
            //需要依次判断是否与前i-1行的皇后在同行||同列||对角线
        {
            if (arr[putAread] == pos || arr[putAread] + i - putAread ==pos
                    || arr[putAread] + putAread -i ==pos )
                return false;
        }
        return true;
    }


    //放置第id行的皇后
    public void putQueen(int id)
    {
        for (int pos = 0; pos <8; pos++) //依次判断每一列,即第pos个位置是否放置
        {
            if (verifyPos(arr, id, pos))
            {
                arr[id] = pos; //可以放,则放置在该位置
                if (id == 7)
                    //是否全部放完,是,计数并打印输出该方案;否,继续放置下一行的皇后
                {
                    count += 1;
                    System.out.println("Solotion "+ count +" like this:");
                    printSolution(arr);
                }
                else
                {
                    putQueen(id+1);
                }
            }

        }

    }

    public void printSolution(int[] arr)
        // 打印输出可行方案
    {

        for (int id = 0; id < 8; id++)
        {
            for (int pos = 0; pos < 8; pos++)
            {
                System.out.print(arr[id]==pos?'Q':'*');
            }
            System.out.println();
        }
    }

}

标签:arr,递归,同一,int,放置,回溯,皇后,摆法
From: https://blog.csdn.net/seeing97/article/details/140559700

相关文章

  • Vue3+Elementplus 递归菜单展示
    这里只是做个笔记,js,css那些都没写子组件MenuItem<template><templatev-if="item.children"><el-sub-menu:index="item.value"><template#title>{{item.label}}</template><MenuItemv-for="childI......
  • 对递归的深度理解及详细示例
    文章目录1.**理解递归的基本概念**2.**识别递归的三个关键部分**3.**逐步分析递归函数**分析4.**手动模拟递归调用**5.**可视化递归**6.**调试和打印**7.**从简单的递归问题开始**8.**理解递归与迭代的关系**9.**练习**示例1:递归实现二叉树的后序遍历分析示......
  • 代码随想录算法训练营Day13 | 二叉树理论基础 二叉树的递归遍历 前序、中序、后序遍历
    一、二叉树理论基础1. 二叉树种类①满二叉树:顾名思义就是结点都满的二叉树。定义:如果一棵二叉树只有度为0的结点和度为2的结点,并且度为0的结点在同一层上,则这棵二叉树为满二叉树。     深度为k,结点数为2^k-1的二叉树②完全二叉树:最后一层可以不满,但最后一层从左......
  • 代码随想录算法训练营第27天 | 回溯3:93.复原IP地址、78.子集、90.子集II
    代码随想录算法训练营第27天|回溯3:93.复原IP地址、78.子集、90.子集II93.复原IP地址https://leetcode.cn/problems/restore-ip-addresses/submissions/547344868/代码随想录https://programmercarl.com/0093.复原IP地址.html#算法公开课78.子集https://leetcode.cn/probl......
  • 代码随想录算法训练营第28天 | 回溯4:491.递增子序列、46.全排列、47.全排列 II
    代码随想录算法训练营第28天|回溯4:491.递增子序列、46.全排列、47.全排列II491.递增子序列https://leetcode.cn/problems/non-decreasing-subsequences/代码随想录https://programmercarl.com/0491.递增子序列.html#算法公开课46.全排列https://leetcode.cn/problems/pe......
  • PHP高性能递归函数
    一个递归方法functionorganizeRecords($regions){$organizedRegions=[];foreach($regionsas$region){$organizedRegions[$region['id']]=$region;$organizedRegions[$region['id']]['chi......
  • 从前序与中序遍历序列构造二叉树-递归
    题目描述:个人题解:        只要我们在中序遍历中定位到根节点,那么我们就可以分别知道左子树和右子树中的节点数目。由于同一颗子树的前序遍历和中序遍历的长度显然是相同的,因此我们就可以对应到前序遍历的结果中,对上述形式中的所有左右括号进行定位。这样的话,我们就......
  • 【LeetCode 0051】【剪枝】N皇后
    N-QueensThen-queenspuzzleistheproblemofplacingnqueensonannxnchessboardsuchthatnotwoqueensattackeachother.Givenanintegern,returnalldistinctsolutionstothen-queenspuzzle.Youmayreturntheanswerinanyorder.Eachsolu......
  • leetcode145. 二叉树的后序遍历,递归法+迭代法,全过程图解+步步解析,一点点教会你迭代法
    leetcode145.二叉树的后序遍历,递归法+迭代法给你一棵二叉树的根节点root,返回其节点值的后序遍历。示例1:输入:root=[1,null,2,3]输出:[3,2,1]示例2:输入:root=[]输出:[]示例3:输入:root=[1]输出:[1]递归法还是一如既往的简单。postorder函数是递归函数,用......
  • 代码随想录算法训练营第26天 | 回溯02:39. 组合总和、40.组合总和II、131.分割回文串
    代码随想录算法训练营第26天|回溯02:39.组合总和、40.组合总和II、131.分割回文串组合总和https://leetcode.cn/problems/combination-sum/代码随想录https://programmercarl.com/0039.组合总和.html40.组合总和IIhttps://leetcode.cn/problems/combination-sum-ii/desc......