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

news2024/11/18 12:29:25

在这里插入图片描述

八皇后问题

八皇后问题是一个经典的回溯算法问题,目的是在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时,该算法可以在很短的时间内求解出所有的八皇后问题的解。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/660659.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件质量保障QA

软件质量保障 目录概述需求&#xff1a; 设计思路实现思路分析1.alibaba guileline2.ckeckstyle3.findBugs4.PMD5.SourceMononiot 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness…

2014年全国硕士研究生入学统一考试管理类专业学位联考英语(二)试题

2014年全国硕士研究生入学考试英语(二)试题 Section I Use of English Directions:   Read the following text. Choose the best word(s) for each numbered blank and mark A, B, C or D on ANSWER SHEET. (10 points)   Thinner isn’t always better. A number of st…

软考A计划-网络工程师-交换机与路由器的配置

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…

MyBatis­-Plus入门

目录 1.特性&#xff1a; 2.mybatis-plus 快速使用 3.mybatis与mybatis-plus实现方式对比 4.BaseMapper接口介绍 5.mybatis-plus中常用的注解 7.全局ID生成策略 8.逻辑删除&#xff08;1&#xff1a;局部逻辑删除&#xff1b;2&#xff1a;全局逻辑删除&#xff09; 8.…

Java代码质量分析Sonar

目录 1. sonar安装1.1 简介1.1.1 客户端1.1.2 sonar 版本区分1.1.2.1 社区版1.1.2.2 开发者版1.1.2.3 企业版 1.2 安装部署1.2.1 修改文件句柄数1.2.2 创建挂载目录1.2.3 创建docker-compose.yml1.2.4 启动1.2.4.1 访问测试 1.2.5 安装插件1.2.5.1 汉化插件 1.3 静态分析插件介…

新手快速搭建springboot项目

一、创建项目 1.1、创建项目 1.2、配置编码 1.3、取消无用提示 1.4、取消无用参数提示 二、添加POM父依赖 <!-- 两种方式添加父依赖或者import方式 --> <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-p…

redis-conf

1 大小写不敏感 2 包含文件 3 网络 4 通用配置 5 快照 6 复制 -----待补充 7 安全 security 8 限制 clients 9 APPEND ONLY MODE aof模式

OpenCV项目开发实战-- 将一个三角形变形为另一个三角形 ( C++ / Python )代码实现

文末附基于Python和C++两种方式实现的测试代码下载链接 图 1:左图中蓝色三角形内的所有像素都已转换为右图中的蓝色三角形。 在本教程中,我们将看到如何将图像中的单个三角形变形为不同图像中的另一个三角形。 在计算机图形学中,人们一直在处理扭曲三角形,因为任何 3D 表…

hadoop集群三之hive安装

这里记录下自己使用虚拟机详细安装hive的过程&#xff0c;在安装hive之前需要保证咋们已经安装好了hadoop&#xff0c;没有的话可以参考我之前的安装的流程 安装mysql # 更新密钥 rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022# 安装Mysql yum库 rpm -Uvh http…

初识 Linux 进程

问题 strace 输出中的 execve(...) 究竟是什么&#xff1f; 进程生命周期 操作系统内部定义了进程的不同状态 Linux 进程基本概念 进程是 Linux 任务的执行单元&#xff0c;也是 Linux 系统资源的分配单元 每个 Linux 应用程序运行后由一个或多个进程构成 每个 Linux 进程可…

对称密钥【密码学】(四)

一、前言 在使用单向散列函数校验数据完整性时&#xff0c;需要保证原始的散列值不能被更改。 因此&#xff0c;在很多场景下&#xff0c;我们并不能仅仅通过单向散列函数来解决完整性问题&#xff0c;还需要其他技术来解决这个问题&#xff0c;如加密技术。 本篇博客就来介绍…

CloudFlare系列--使用第三方来自定义CSDN的IP(蓝精灵)

原文网址&#xff1a;CloudFlare系列--使用第三方来自定义CSDN的IP(蓝精灵)_IT利刃出鞘的博客-CSDN博客 简介 说明 本文介绍CloudFlare的CDN如何自定义第三方IP。 概述 CloudFlare官网接入域名的方式只能是 NS 接入&#xff0c;这样默认DNS服务器只能改为CloudFlare的DNS服…

从零开始Vue项目中使用MapboxGL开发三维地图教程(七)创建一个自动旋转的地球、添加一个3D模型、实现在两个地图之间滑动和同步来比较两个地图

目录 1、创建一个自动旋转的地球地图2、添加一个3D模型3、一个页面创建两个底图之间滑动 1、创建一个自动旋转的地球地图 实现功能&#xff1a;地球仪和camera动画结合在一起&#xff0c;创建旋转行星效果。 实现思路&#xff1a;通过在动画结束时调用easeTo&#xff0c;旋转…

软考A计划-网络工程师-IP,TCP,UDP,ICMP报头

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列 &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff…

YOLOv5/v7 添加注意力机制,30多种模块分析⑤,SOCA模块 ,SimAM模块

目录 一、注意力机制介绍1、什么是注意力机制&#xff1f;2、注意力机制的分类3、注意力机制的核心 二、SOCA模块1、SOCA模块的原理2、实验结果3、应用示例 三、SimAM模块1、SimAM模块的原理2、实验结果3、应用示例 大家好&#xff0c;我是哪吒。 &#x1f3c6;本文收录于&…

Vue 面试题

一、对于MVVM的理解&#xff1f; MVVM 是 Model-View-ViewModel 的缩写。 1、Model 代表数据模型&#xff0c;也可以在Model中定义数据修改和操作的业务逻辑。 2、View 代表UI 组件&#xff0c;它负责将数据模型转化成UI 展现出来。 3、ViewModel 监听模型数据的改变和控制…

【分布式系统】分布式唯一ID生成方案总结

目录 UUID实现 数据库生成IDsegment号段模式美团Leaf-segment号段模式Redis生成ID实现 zookeeper生成ID实现 snowflake雪花算法实现 Leaf-snowflake雪花算法百度UidGenerator滴滴TinyID双号段缓存多DB支持tinyid-client 参考 UUID 基本方法之一。 UUID(Universally Unique Id…

Java阿里巴巴代码规范

目录 1 编程规约1.1 方法参数类型必须一致&#xff0c;不要出现自动装箱拆箱操作1.1.1 反例1.1.2 正例 1.2 SimpleDateFormat是线程不安全的1.2.1 反例1.2.2 正例 1.3 使用equals方法应该注意空指针1.3.1 反例1.3.2 正例 2 异常日志2.1 事务场景中如果异常被被捕获要注意回滚2.…

2023 年最适用于工业物联网领域的三款开源 MQTT Broker

MQTT 最初作为一种轻量级的发布/订阅消息传递协议而设计&#xff0c;如今已经成为工业物联网&#xff08;IIoT&#xff09;和工业 4.0 发展的重要基础。它的意义在于实现了各类工业设备与云端的无缝连接&#xff0c;促进了运营技术&#xff08;OT&#xff09;和信息技术&#x…

MySQL----事物与存储引擎

文章目录 一、事务介绍1.1 MySQL 事务的概念1.2 事务的ACID特点原子性一致性隔离性持久性 1.3 事务之间的相互影响1.4 设置隔离级别1.5事务控制语句1.6使用 set 设置控制事务 二、存储引擎介绍2.1查看系统支持的存储引擎2.2 修改存储引擎2.3InnoDB行锁与索引的关系 一、事务介绍…