回溯法——(2)n皇后问题(C语言讲解)(LeetCode51 N皇后思想)(4皇后棋盘画图举例)(附代码)

目录

一、问题概括

二、算法分析

三、举例(4皇后棋盘)

 四、算法实现 

4.1运行结果:


51. N 皇后 - 力扣(LeetCode)

一、问题概括

        n皇后问题是19世纪著名数学家高斯于1850年提出的。

        问题是:在n×n的棋盘上摆放n个皇后,使其不能相互攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上。

二、算法分析

         按照国际象棋规则,皇后可以攻击与之在同一行或同一列或同一斜线上的棋子。

核心分析

        n后问题等价于在n×n格的棋盘上放置n个皇后,任何2个皇后不放在同一行同一列同一斜线上。 

         由以上问题与分析可知,棋盘每一行可以并且必须拜访1个皇后。

        1、那么n皇后问题的可能解用1个n元向量(x1,x2,......,xn)表示,即第i个皇后摆放在第i行第xi列的位置(1≤i≤n且1≤xi≤n)。

        2、由于两个皇后不能位于同一列,所以,n皇后问题的解的向量必须满足约束条件xi≠xj

        3、不在同一斜线上的约束条件|i-j|≠|xi-xj|。

三、举例(4皇后棋盘)

        下面将利用4皇后问题详细讲解。

       (Q代表皇后放置符号,×代表放置失败的符号)

        ①首先把皇后1摆放到所在第一行第一列

        ②皇后2本着不能与皇后1同行同列同斜线的原则 ,经过不懈努力尝试最终放置在了第二行第三列

        ③皇后3根据同样的原理(同行同列同斜线的原则)尝试了第三行的任何一列都冲突。

        ④因此进行回溯,将皇后2摆放到下一个位置, 即皇后2第二行第四列。

         ⑤皇后3再次本着同行同列同斜线的原则,摆放到第三行第二列。

        ⑥

                1、皇后4,摆放到第四行任何一列,都会违背同行同列同斜线的原则,进行回溯;

                2、发现皇后3除了摆放到第三行第二列不违背原则,其他列放置同样违背原则,因此我们继续回溯;

                3、但当我们此时回溯到皇后2时发现皇后2已经位于相应行最后一列了,所以我们只能继续回溯;

                4、回溯到皇后1,将皇后1摆放到第一行第二列。

        ⑦接下来,将皇后2摆放到第二行第四列,皇后3摆放到第三行第一列,皇后4摆放到第四行第三列的位置,便得到了4皇后问题的一个解。

 四、算法实现 

#include <stdio.h>
#include <stdlib.h>

#define N 4  // 可以更改 N 的值来解决不同大小的皇后问题
int count = 0;

void printBoard(int board[N][N]);

// 函数来检查是否可以在 board[row][col] 放置皇后
int isSafe(int board[N][N], int row, int col) {
    int i, j;

    // 检查同一列
    for (i = 0; i < row; i++)
        if (board[i][col] == 1)
            return 0;

    // 检查左上对角线
    for (i = row, j = col; i >= 0 && j >= 0; i--, j--)
        if (board[i][j] == 1)
            return 0;

    // 检查右上对角线
    for (i = row, j = col; i >= 0 && j < N; i--, j++)
        if (board[i][j] == 1)
            return 0;

    return 1;
}

// 函数来解决 N 皇后问题
void solveNQUtil(int board[N][N], int row, int& solutions) {
    // 如果所有皇后都放置完成
    if (row >= N) {
        solutions++;
        printBoard(board);
        return;
    }

    // 在当前行尝试放置皇后并递归地放置剩下的皇后
    for (int col = 0; col < N; col++) {
        // 检查放置皇后的位置是否安全
        if (isSafe(board, row, col)) {
            board[row][col] = 1;  // 放置皇后
            solveNQUtil(board, row + 1, solutions);  // 递归放置下一个皇后
            board[row][col] = 0;  // 回溯
        }
    }
}

// 打印棋盘函数
void printBoard(int board[N][N]) {
    printf("Solution %d:\n", ++count);
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++)
            printf("%d ", board[i][j]);
        printf("\n");
    }
    printf("\n");
}

// 用于解决 N 皇后问题的主函数
void solveNQ() {
    int board[N][N] = { 0 };  // 初始化棋盘
    int solutions = 0;
    solveNQUtil(board, 0, solutions);

    printf("Total number of solutions are %d\n", solutions);
}

// 主函数
int main() {
    solveNQ();
    return 0;
}

4.1运行结果:

         这个代码尝试在棋盘的每一行放置皇后,并使用递归来检查每个位置是否安全。如果找到一个安全的放置位置,就会递归地尝试下一行。这个过程一直重复,直到所有皇后都被放置在棋盘上。每次成功放置所有皇后时,它都会增加解决方案的数量,并打印出当前棋盘作为一个新的解决方案。 


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

QT 使用QLsitView 实现多个子项选中取消效果

文章目录 效果图概述部分代码总结 效果图 概述 整个界面的布局介绍请看这篇博客想要的到这种自由选择中的Item效果&#xff0c;需要使用到Model-view的思想&#xff0c;每个item中都要存放一个标志位&#xff0c;用在Paint函数去判断是否绘制为按下的状态。每次item被点击时&a…

docker- 购建服务镜像并启动

文章目录 前言docker- 购建服务镜像并启动1. 前期准备2. 构建镜像3. 运行容器4. 验证 前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&#xff0c;实…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-23.1,2 讲 I2C驱动

前言&#xff1a; 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM&#xff08;MX6U&#xff09;裸机篇”视频的学习笔记&#xff0c;在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

顶坚北斗有源终端有什么功能跟用途

顶坚北斗有源终端作为现代卫星导航与通信技术融合的杰出代表&#xff0c;其用途广泛且功能强大。在广袤无垠的偏远山区、深邃的海洋以及荒芜的沙漠中&#xff0c;当用户面临移动通信信号无法覆盖的困境时&#xff0c;北斗有源终端便成为了连接世界的桥梁。 该终端的核心功能之一…

开关电源重点可靠性测试项目与测试方法

为确保开关电源在复杂工作环境下的安全性与稳定性&#xff0c;各种安全性测试成为不可或缺的环节。本文将深入探讨几项关键的安全性测试项目&#xff0c;帮助用户全面了解如何评估开关电源的可靠性和安全性。 一、过压保护测试方法 目的是为了检测当输出电压过高时&#xff0c;…

陕西煤矿化工集团如何投稿刊登到央媒

随着信息技术的飞速发展&#xff0c;国家级媒体平台已经成为了众多作者追求发表文章的热门选择。然而&#xff0c;要想在这些平台上成功发表文章&#xff0c;除了具备优秀的文稿质量外&#xff0c;还需要掌握一定的投稿技巧和策略。本文将为您详细介绍国家级媒体投稿方式&#…

【重磅】史上最全的论文图表基本规范

会议文章对图片质量的要求比较低&#xff0c;一般投了后基本都没有修改的机会&#xff0c;而杂志文章对图片质量的要求相当高&#xff0c;可能来回改几次才能满足要求。如果论文投稿前就达到了较高的质量&#xff0c;相信修改时会轻松很多。 以《Nature》期刊为例&#xff0c;…

BFT Robotics - 您的智能自动化伙伴

“买机器人&#xff0c;上BFT” 自动化和机器人技术是推动现代工业发展的重要力量。BFT Robotics以其创新的产品系列和定制化解决方案&#xff0c;为企业提供了一条通往高效、智能生产环境的道路。通过采用BFT Robotics的产品和服务&#xff0c;企业不仅能够提高生产效率&#…

JMeter 基本使用【Windows Jmeter GUI 图形界面】

1.安装jmeter GUI图形界面 需要安装JDK 官方网址: Apache JMeter - Apache JMeter™ linux tgz windows zip 2. 目录及文件 bin: 核心可执行文件&#xff0c;包含配置 extras&#xff1a;插件扩展包 lib&#xff1a;核心依赖包 ext&#xff1a;核心包 junit&#xff1a;单…

四川古力科技抖音小店,创新科技点亮购物新体验

在这个数字化浪潮汹涌的时代&#xff0c;四川古力科技以其前瞻性的战略眼光和创新能力&#xff0c;闪耀于抖音小店这片电商新蓝海&#xff0c;开启了未来购物的新纪元。作为一家集技术研发、产品创新、市场营销于一体的科技型企业&#xff0c;古力科技不仅为消费者带来了前所未…

html+css绘制自定义样式输入框

效果&#xff1a; 代码&#xff1a; html部分&#xff1a; <div class"box"> <div class"newbox"><input type"text" required><div class"name">Username</div></div> </div>css部分 …

神经网络的工程基础(三)——更优化的最优化算法

相关说明 这篇文章的大部分内容参考自我的新书《解构大语言模型&#xff1a;从线性回归到通用人工智能》&#xff0c;欢迎有兴趣的读者多多支持。 本文将讨论更优化的最优化问题算法。 关于大语言模型的内容&#xff0c;推荐参考这个专栏。 内容大纲 相关说明一、概述二、算…

1103 缘分数(测试点4)

solution 测试点4&#xff1a;1 1不符合缘分数定义&#xff0c;但是这个判断能够通过记得排除掉 #include<iostream> #include<cmath> using namespace std; bool judge(int n){int t sqrt(n);if(t * t n) return true;return false; } int main(){int n, m, c…

淘宝订单系统ERP中如何接入平台订单信息?(订单API)

淘宝开放平台中有交易API&#xff0c;里面有各种关于交易的API接口。但是申报应用权限的审核流程严格又漫长。不少公司费时费力的申请后&#xff0c;结果还是没有审批下来。 调用淘宝自定义接口custom&#xff0c;可以实现淘宝开放平台API的调用。技术人员会根据您需要的接口做…

思科模拟器--03.RIP协议路由--24.5.17

1.首先&#xff0c;先创建两个个人电脑:PC0和PC1和三个路由器:R1&#xff0c;R2和R3. (诀窍:建议用文本框标注一下重要简短的内容; 目的:降低失误概率,提高成功率!) 第0步:(个人电脑的IP,子网掩码和默认网关配置) 接着&#xff0c;可以先将个人电脑的IP和网关先配置一下…

面试-软件工程与设计模式相关,Spring简介

面试-软件工程与设计模式相关&#xff0c;Spring简介 1.编程思想1.1 面向过程编程1.2 面向对象编程1.2.1 面向对象编程三大特征 1.3 面向切面编程1.3.1 原理1.3.2 大白话&#xff1f;1.3.3 名词解释1.3.4 实现 2. 耦合与内聚2.1 耦合性2.2 内聚性 3. 设计模式3.1 设计模型七大原…

7.从0做一个vue键盘组件

文章目录 1. 从0做一个键盘组件1.1. 最终效果1.2. 分析1.3. 实现1.4. 如何引用 1. 从0做一个键盘组件 首先是why的问题&#xff1a;为什么需要做键盘组件&#xff1f; 我们目前可知的场景&#xff1a; 在新增账单的时候&#xff0c;需要用到键盘在比如从账单列表页&#xff…

基于Kafka的日志采集

目录 前言 架构图 资源列表 基础环境 关闭防护墙 关闭内核安全机制 修改主机名 添加hosts映射 一、部署elasticsearch 修改limit限制 部署elasticsearch 修改配置文件 启动 二、部署filebeat 部署filebeat 添加配置文件 启动 三、部署kibana 部署kibana 修…

实现底部表情评价,聚焦改变颜色,点击坏评价自动变成好评价

如下&#xff0c;非常简单的一个小玩意。 废话不多说直接上代码&#xff1a; <!--* 轮子的作者: 轮子哥* Date: 2024-05-22 10:43:45* LastEditTime: 2024-05-24 10:28:53 --> <!DOCTYPE html> <html lang"en"><head><meta charset"…

51-指针_野指针,指针运算

51-1 野指针 51-1-1 什么是野指针 概念&#xff1a;野指针就是指针指向的位置是不可知的&#xff08;随机的、不正确的、没有明确限制的) 没有初始化 int main() {int* p;//p没有初始化&#xff0c;就意味着没有明确的指向//一个局部变量不初始化的话&#xff0c;放的是随机…