算法与数据结构——递归算法+回溯算法——八皇后问题

这篇具有很好参考价值的文章主要介绍了算法与数据结构——递归算法+回溯算法——八皇后问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

算法与数据结构——递归算法+回溯算法——八皇后问题

八皇后问题

八皇后问题是一个经典的回溯算法问题,目的是在8×8的国际象棋棋盘上放置八个皇后,使得没有皇后可以互相攻击(即没有两个皇后在同一行、同一列或同一对角线上)。

回溯算法是一种解决问题的算法,它通过尝试所有可能的解决方案来解决问题。在八皇后问题中,计算机从棋盘的第一行开始,尝试在每个格子里放一个皇后,然后递归地向下一行棋盘延伸,直到成功地放置所有皇后,或者找到了不行的放置方式,就回溯到上一行来找到新的放置方式。

八皇后问题是经典的计算机科学问题之一,同时也是深度学习和人工智能中的一个重要案例。 许多算法都可以解决这个问题,包括暴力搜索、深度优先搜索、启发式搜索、遗传算法等。

递归算法

递归算法是一种解决问题的算法,它将问题拆分成一个或多个相同的子问题,然后通过求解这些子问题来逐步求解原问题。递归算法通常使用函数或方法进行实现,函数或方法本身会调用自身或其他函数或方法来完成求解。

在实现递归算法时,需要考虑以下几个方面:

  1. 退出条件:递归过程中必须有退出条件,否则会出现无限递归的情况。
  2. 子问题拆分:原问题必须能够拆分成相同的子问题,子问题之间必须有边界,子问题之间不会循环依赖。
  3. 递归调用:递归过程中必须正确调用自身或其他函数或方法,同时要维护好递归状态,确保函数执行时的状态正确性。

递归算法在生物学、计算机科学、语言学和数学等领域都有应用。在计算机科学领域,递归算法被广泛应用于实现数据结构、排序、查找、图形和应用程序的设计等。常见的递归算法包括二叉树的遍历、图的遍历、动态规划等。

回溯算法

回溯算法是一种解决问题的算法,通常用于在一个大的问题中求解所有可能的解决方案。该算法通过不断尝试解决方案中的每个选择,直到找到可行解或者无法继续尝试后,再回溯到前一步做出新的选择,继续尝试其他的选择,直到找到所有的解或者没有解。

回溯算法通常采用递归方式来实现,每次递归时,将当前的选择作为参数传递到下一次递归中,并在递归返回时恢复现场。在实现中,通常通过由一个标志来表示当前状态的合法性,并在选择时剪枝,只保留合法的选择,以避免重复的尝试。

回溯算法具有普适性,可以解决一大类问题,如排列问题、组合问题、划分问题、子集问题、连通性问题、游戏问题、迷宫问题等。同时,回溯算法也是NP完全问题的解决算法之一,如旅行商问题、背包问题等。

虽然回溯算法是一种朴素的暴力搜索算法,但是在面对一些规模较小的问题时,它往往具有不错的解决效果。

python实现八皇后问题

以下是Python的一种实现方式,用回溯算法求解八皇后问题:

def solve_n_queens(n):
    res = []

    def backtrack(board, row):
        if row == n:
            res.append(list(board))
            return
        for col in range(n):
            if not is_valid(board, row, col):
                continue
            board[row][col] = 'Q'
            backtrack(board, row+1)
            board[row][col] = '.'

    def is_valid(board, row, col):
        n = len(board)
        # 检查列是否有皇后冲突
        for i in range(n):
            if board[i][col] == 'Q':
                return False
        # 检查右上方是否有皇后冲突
        for i, j in zip(range(row-1, -1, -1), range(col+1, n)):
            if board[i][j] == 'Q':
                return False
        # 检查左上方是否有皇后冲突
        for i, j in zip(range(row-1, -1, -1), range(col-1, -1, -1)):
            if board[i][j] == 'Q':
                return False
        return True

    board = [['.' for _ in range(n)] for _ in range(n)]
    backtrack(board, 0)

    return res

该算法的时间复杂度为 O ( N ! ) O(N!) O(N!),其中 N N N为皇后个数。在 N = 8 N=8 N=8时,该算法可以在很短的时间内求解出所有的八皇后问题的解。

java实现八皇后问题

以下是Java的一种实现方式,用回溯算法求解八皇后问题:

import java.util.*;

public class NQueens {
    public static List<List<String>> solveNQueens(int n) {
        List<List<String>> res = new ArrayList<>();

        backtrack(new char[n][n], 0, res);

        return res;
    }

    private static void backtrack(char[][] board, int row, List<List<String>> res) {
        if (row == board.length) {
            List<String> solution = new ArrayList<>();
            for (char[] c : board) {
                solution.add(new String(c));
            }
            res.add(solution);
            return;
        }

        for (int col = 0; col < board.length; col++) {
            if (!isValid(board, row, col)) {
                continue;
            }
            board[row][col] = 'Q';
            backtrack(board, row+1, res);
            board[row][col] = '.';
        }
    }

    private static boolean isValid(char[][] board, int row, int col) {
        // 检查列是否有皇后冲突
        for (int i = 0; i < row; i++) {
            if (board[i][col] == 'Q') {
                return false;
            }
        }
        // 检查右上方是否有皇后冲突
        for (int i = row-1, j = col+1; i >= 0 && j < board.length; i--, j++) {
            if (board[i][j] == 'Q') {
                return false;
            }
        }
        // 检查左上方是否有皇后冲突
        for (int i = row-1, j = col-1; i >= 0 && j >= 0; i--, j--) {
            if (board[i][j] == 'Q') {
                return false;
            }
        }
        return true;
    }

    public static void main(String[] args) {
        List<List<String>> solutions = solveNQueens(8);
        for (List<String> solution : solutions) {
            for (String row : solution) {
                System.out.println(row);
            }
            System.out.println();
        }
    }
}

该算法的时间复杂度为 O ( N ! ) O(N!) O(N!),其中 N N N为皇后个数。在 N = 8 N=8 N=8时,该算法可以在很短的时间内求解出所有的八皇后问题的解。文章来源地址https://www.toymoban.com/news/detail-492388.html

到了这里,关于算法与数据结构——递归算法+回溯算法——八皇后问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【算法】递归解决各种数据结构的遍历问题

    对于递归算法,我们最先想到的应该就是用递归的方式去中序遍历一棵树,递归的使用使得我们可以先深入到下层中,然后慢慢的输出下层的元素之后输出上层元素。 因此,基于此,我们甚至可以使用递归来逆序输出一个栈,链表等数据结构。 使用递归输出树 使用递归逆序

    2024年02月08日
    浏览(69)
  • 【回溯算法篇】N皇后问题

    🌠 作者:@ 阿亮joy. 🎆 专栏:《数据结构与算法要啸着学》 🎇 座右铭:每个优秀的人都有一段沉默的时光,那段时光是付出了很多努力却得不到结果的日子,我们把它叫做扎根 n 皇后问题研究的是如何将 n 个皇后放置在 n × n 的棋盘上,并且使皇后彼此之间不能相互攻击。

    2024年01月16日
    浏览(37)
  • 算法:回溯算法(以解决n皇后问题为例)

    基本思想:回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。八皇后问题就是回溯算法的典型,第一步按照顺序放一个皇后,然后第二步符合要求放第2个皇后,如果没有位置符合要求,那么就要改变第一个皇后的位置,重新放第2个皇后

    2024年02月05日
    浏览(32)
  • python中级篇1:n皇后问题(回溯算法)

    hello!大家好,我是浪矢秀一。最近经历了许多事情,终于是恢复1次更新了。那么今天呢,我们来学习中级篇,需要学过不少python知识的人来学习。好了,废话不多说,我们进入今天的课程!   在1个n*n的国际象棋棋盘上,放置n个皇后,要求:同1行、同1列、同1斜线上只能有1个皇后。   既然

    2024年02月03日
    浏览(37)
  • 【数据结构与算法】【约瑟夫问题】还在用递归?教你用链表秒杀约瑟夫

     🎉🎉欢迎光临🎉🎉 🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀 🌟特别推荐给大家我的最新专栏 《数据结构与算法:初学者入门指南》📘📘 本专栏纯属为爱发电永久免费!!! 这是苏泽的个人主页可以看到我其他的内容哦👇👇 努力的苏泽 http://su

    2024年02月19日
    浏览(38)
  • 数据结构-回溯算法

    基本概念 深度优先搜索 :回溯算法通常采用深度优先搜索策略来遍历解空间。这意味着它会沿着一条路径尽可能深入地探索,直到遇到一个死胡 试探与回溯 :溯算法的核心在于“试错”。它会在搜索过程中做出一系列选择,形成一条可能的解路径。当发现当前路径无法导致有

    2024年04月29日
    浏览(33)
  • N皇后问题详解:回溯算法的应用与实践(dfs)

    题目如上图所示,在一个 n*n 的国际象棋棋盘上怎么摆放能使得皇后互相攻击不到(也就是在 任意一列、一行、一条对角线上都不存在两个皇后 ) 1.DFS 想要解决这个问题,我们可以使用dfs也就是 深度优先遍历 ,深度优先搜索的步骤为先递归到底再回溯上来,顾名思义,df

    2024年03月26日
    浏览(52)
  • 【夜深人静学数据结构与算法】回溯算法

    目录 前言: 回溯算法: 回溯法的常见应用: 回溯法的模板: 回溯法的图解:​ 案例: 77. 组合 - 力扣(LeetCode) 总结:         回溯算法是一个比较抽象的算法,因此我们如果初学者,难度可以说是非常大,因此我们利用这篇来讲解回溯算法的理论知识,后续在力扣刷题里

    2024年02月11日
    浏览(41)
  • 递归算法学习——N皇后问题,单词搜索

    目录 ​编辑 一,N皇后问题 1.题意 2.解释 3.题目接口 4.解题思路及代码 二,单词搜索 1.题意 2.解释 3.题目接口 4.思路及代码 1.题意 按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题  研究的是如何将  n  个皇后放置在  n×n  的

    2024年02月09日
    浏览(40)
  • 数据结构:地图着色问题——图的应用——回溯法

    目录 前言 一、解决问题的思路 二、存储结构设计 三、代码 1.创建图函数 2.判断色号是否相同函数 3.回溯函数 4.整体代码 总结 本次解决的问题:用图模拟部分地图,对各省进行着色,要求相邻省所使用的颜色不同,并保证使用的颜色总数最少。 先来一张效果图 将邻接矩阵

    2024年02月04日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包