【中级软件设计师】—(针对上午题)算法分析与设计(三十八)

news2024/11/24 22:46:55

【中级软件设计师】—(针对上午题)算法分析与设计(三十八)

在这里插入图片描述
在这里插入图片描述

一、回溯法

1. 什么是回溯法?

相信"迷宫"是许多人儿时的回忆,大家小时候一定都玩过迷宫游戏。我们从不用别人教,都知道走迷宫的策略是:

当遇到一个岔路口,会有以下两种情况:

存在没走过的路。此时可以任意选一条没走过的路深入,只要记住我们所走过的路径即可。

倘若下次再来到这个路口,便不再沿着走过的路径继续深入,而是沿着没走过的路径深入下去;

所有路都已经走过。如果所有岔路口都已经遍历,则回退至上一个最近的岔路口。

当遇到死胡同,便回退到刚才距离最近的岔路口。

不断前进并重复该过程,直到找到终点或回退到起点位置。

其实,这就是回溯法:一个基于深度优先搜索和约束函数的问题求解方法。

(1)、n皇后问题

在这里插入图片描述

在这里插入图片描述

📢 非递归求解n皇后问题

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

#define N 4

int q[N + 1]; // 存储皇后的列号

int check(int j)
{ // 检查第i个皇后的位置是否合法
    int i;
    for (i = 1; i < j; i++)
    {
        if (q[i] == q[j] || abs(i - j) == abs(q[i] - q[j]))
        { // 判断是否在同一斜线上
            return 0;
        }
    }
    return 1;
}

void queen()
{ //
    int i;
    for (i = 1; i <= N; i++)
    {
        q[i] = 0;
    }
    int answer = 0; // 方案数
    int j = 1;      // 表示正在摆放第j个皇后
    while (j >= 1)
    {
        q[j] = q[j] + 1; // 让第j个皇后向后一列摆放

        while (q[j] <= N && !check(j))
        {                    // 判断第j个皇后的位置是否合法
            q[j] = q[j] + 1; // 不合法就往后一个位置摆放
        }
        if (q[j] <= N)
        { // 表示第j个皇后的找到一个合法的位置
            if (j == N)
            { // 找到了一组皇后的解
                answer = answer + 1;
                printf("放案%d:", answer);
                for (i = 1; i <= N; i++)
                {
                    printf("%d", q[i]);
                }
                printf("\n");
            }
            else
            { // 继续摆放下一个皇后
                j = j + 1;
            }
        }
        else{ // 表示第j个皇后找不到一个合法的位置
            q[j] = 0;  // 还原第j个皇后的位置
            j = j - 1; // 回溯
        }
    }
}
int main()
{
    queen();
    return 0;
}

📢 递归求解n皇后问题

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

#define N 4

int answer=0;

int q[N + 1]; // 存储皇后的列号

int check(int j)
{ // 检查第i个皇后的位置是否合法
    int i;
    for (i = 1; i < j; i++)
    {
        if (q[i] == q[j] || abs(i - j) == abs(q[i] - q[j]))
        { // 判断是否在同一斜线上
            return 0;
        }
    }
    return 1;
}

void queen(int j){
    int i;
    for(i=1;i<=N;i++){
        q[j]=i;
if(check(j)){// 当摆放的皇后位置为合法时
    if(j==N){//找到了N皇后的一组解
        answer=answer+1;
        printf("方案%d:",answer);

        for(i=1;i<=N;i++){
            printf("%d",q[i]);
        }
        printf("\n");
    }else{
        queen(j+1);//递归摆放下一个位置
    }
}
    }
}

 
int main()
{

 queen(1);

    return 0;
}

在这里插入图片描述

二、分治法

递归的概念
在这里插入图片描述
在这里插入图片描述
分治法的基本思想
在这里插入图片描述

2

在这里插入图片描述

3

在这里插入图片描述

4

在这里插入图片描述

5

在这里插入图片描述

三、动态规划

动态规划法的基本思想:

在这里插入图片描述
在这里插入图片描述

动态规划—背包问题

01背包问题

在这里插入图片描述
在这里插入图片描述

#include <stdio.h>

#define N 4 // 物品数量
#define W 5 // 背包容量

int max(int a, int b)
{
    return a > b ? a : b;
}

int main()
{
    int v[] = {0, 2, 4, 5, 6}; // 物品价值数组
    int w[] = {0, 1, 2, 3, 4}; // 物品重量数组

    int f[N + 1][W + 1] = {}; // 子问题解数组

    int i, j;
    for (i = 1; i <= N; i++)
    {
        for (j = 1; j <= W; j++)
        {
            f[i][j] = f[i - 1][j]; // 默认不选第i个物品
            if (j >= w[i])
            { // 选第i个物品的前提条件
                // 等于  不选第i个物品 和选第i个物品 两者的较大值
                f[i][j] = max(f[i][j], f[i - 1][j - w[i]] + v[i]);
            }
        }
    }
    printf("%d\n", f[N][W]);

    for (i = 0; i <= N; i++)
    {
        for (j = 0; j <= W; j++)
        {
            printf("%d", f[i][j]);
        }
        printf("\n");
    }
    return 0;
}

在这里插入图片描述

0-1背包问题时间复杂度和空间复杂度

在这里插入图片描述

6

在这里插入图片描述

7

在这里插入图片描述

8

在这里插入图片描述
在这里插入图片描述

9

在这里插入图片描述
在这里插入图片描述
📢矩阵相乘问题:算法策略动态规划法,时间复杂度为O(n^3),空间复杂度O(n^2)

10

在这里插入图片描述
在这里插入图片描述

11

在这里插入图片描述

12

在这里插入图片描述

记住:
在这里插入图片描述
在这里插入图片描述

四、贪心法

贪心法的基本思想

在这里插入图片描述

部分背包问题

在这里插入图片描述
在这里插入图片描述
部分背包问题代码实现
在这里插入图片描述

13😭😭

在这里插入图片描述

14😭😭

在这里插入图片描述

15

在这里插入图片描述
在这里插入图片描述

16

在这里插入图片描述

答案:C B B A,不理解的看up算法的P31个视频

五、算法总和

📢贪心法

在这里插入图片描述

📢📢回溯法

在这里插入图片描述

📢📢📢分支限界法

在这里插入图片描述

17

在这里插入图片描述

18

在这里插入图片描述

19

在这里插入图片描述

20

在这里插入图片描述

21

在这里插入图片描述

22

在这里插入图片描述

完结 撒花👏👏👏👏

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

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

相关文章

TryHackMe-M4tr1x: Exit Denied(boot2root)

M4tr1x: Exit Denied 大多数人只看到一个完美构建的系统。但你一直都是不同的。你不仅看到表面上的东西&#xff0c;还看到 它下面有什么统治;调节和调节的内部关联机制 几乎完美地管理其每个模块&#xff0c;以至于它试图隐藏所有模块 其多面设计中的微小孔。但是&#xff0c…

【数据结构】链表详解

本片要分享的内容是链表&#xff0c;为方便阅读以下为本片目录 目录 1.顺序表的问题及思考 1.链表的遍历 2.头部插入 2.1开辟空间函数分装 3.尾部插入 纠正 4.尾部删除 5.头部删除 6.数据查找 7.任意位置插入 1.顺序表的问题及思考 上一篇中讲解了顺序表中增删查…

【Linux】如何理解缓冲区

文章目录 &#x1f4d5; 看现象&#x1f4d5; 理解本质&#x1f4d5; 模拟文件接口mystdio.hmystdio.c &#x1f4d5; 看现象 如下代码&#xff0c;运行结果如图。 1 #include<sys/types.h> 2 #include<sys/stat.h> 3 #include<fcntl.h> 4 #include<s…

算法强化--分解因数

大家好,今天为大家带来一道题目 链接&#xff1a;https://www.nowcoder.com/questionTerminal/0f6976af36324f8bab1ea61e9e826ef5 来源&#xff1a;牛客网 [编程题]分解因数 热度指数&#xff1a;8605时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒空间限制&#xff1a;…

臻图信息:数字技术推动智慧楼宇开启新模式

近年来&#xff0c;在数字技术的迅速发展下&#xff0c;正在深刻影响着各行各业的发展趋势。现代建筑行业已经随着通信技术、AI 智能技术、计算机技术的发展&#xff0c;向着新的发展模式开始转变。 借助数字孪生技术构建数字化、流程化的物联网平台&#xff0c;新的智能楼宇建…

串口通讯详解

目录 一、串口通讯简介&#xff1a; 二、串口通信基本原理&#xff1a; 三、通信方式 四、串口通信特点 一、串口通讯简介&#xff1a; &#xff08;1&#xff09;串口通讯是指通过串口进行数据传输的一种通讯方式&#xff0c;通过数据信号线、地线等&#xff0c;按位进行传输数…

【Python】实战:生成无关联单选问卷 csv《社会参与评估表》

目录 一、适用场景 二、业务需求 三、Python 文件 &#xff08;1&#xff09;创建文件 &#xff08;2&#xff09;代码示例 四、csv 文件 一、适用场景 实战场景&#xff1a; 问卷全部为单选题问卷问题全部为必填问题之间无关联关系每个问题的答案分数不同根据问卷全…

论文阅读:DLME = Deep Local-flatness Manifold Embedding

Author: Zelin Zang, Siyuan Li, Di Wu and Stan Z Li. 1-4: Westlake University 摘要 流形学习&#xff08;ML, Manifold learning&#xff09;旨在从高维数据中识别低维结构和嵌入&#xff0c;然而我们发现现有工作在采样不足的现实数据集上效果不佳。一般的ML方法对数据结…

C++学习记录——이십 map和set

文章目录 1、setmultiset 2、map3、map::operator[] 1、set vector/list/deque等是序列式容器&#xff0c;map&#xff0c;set是关联式容器。序列式容器的特点就是数据线性存放&#xff0c;而关联式容器的数据并不是线性&#xff0c;数据之间有很强的关系。 它们的底层是平衡…

P1038 [NOIP2003 提高组] 神经网络

题目背景 人工神经网络&#xff08;Artificial Neural Network&#xff09;是一种新兴的具有自我学习能力的计算系统&#xff0c;在模式识别、函数逼近及贷款风险评估等诸多领域有广泛的应用。对神经网络的研究一直是当今的热门方向&#xff0c;兰兰同学在自学了一本神经网络的…

用PyCharm和Anaconda搭建强化学习环境

一些碎语&#xff1a;因为我之前没学习过python&#xff0c;所以搭建这个环境的周期差不多一周&#xff0c;最终搭好了这个又爱又恨的环境&#xff08;这个成语用的多少有点文化沙漠了&#xff09;&#xff0c;这里简单梳理一下搭建环境的完整步骤。 首先下载Anaconda 下载地址…

Java线程间通信方式(3)

前文了解了线程通信方式中的CountDownLatch&#xff0c; Condition&#xff0c;ReentrantLock以及CyclicBarrier&#xff0c;接下来我们继续了解其他的线程间通信方式。 Phaser Phaser是JDK1.7中引入的一种功能上和CycliBarrier和CountDownLatch相似的同步工具&#xff0c;相…

mapbox-gl 移动端(H5)位置共享交互

文章目录 前言逆地理编码&#xff1a;获取周边地点地理编码&#xff1a;查询位置大头针选位位置卡片 前言 分享最近写的一个小demo&#xff0c;功能类似微信小程序端的大头针位置共享功能&#xff0c;需要实现的主要功能包括位置查询、周边地点检索、位置定位等&#xff0c;数…

BUUCTF jarvisoj_level0

小白垃圾做题笔记而已&#xff0c;不建议阅读。。。 这道题感觉主要就是64位程序ebp8 题目中给出了shellcode 我们直接将返回地址覆盖就好。 在main函数中调用了vulnerable_function()函数。 vulnerable函数是一个漏洞函数&#xff1a;(存在缓溢出)&#xff0c;我们只需要将…

html-audio标签样式重写思路

搭配slider 组件 ,利用原生audio的属性和方法重写样式 写个样式.监听url变化 初始化绑定播放, 拖动进度条,拖动音量, 静音按钮等事件 const audioRef ref(null) // 绑定audio标签 const playProcess ref(0) // 进度条绑定的值 const volume ref(1) // 音量绑定的值 const …

C++ STL之vector容器

目录 一、vector容器的介绍 二、vector容器的使用 1.vector的构造函数 2.vector的赋值操作 3.vector的容量与大小 4.vector的插入和删除 5.vector的数据存取 6.vector的互换容器 7.算法模块在vector的应用 ①find算法(std) ②sort算法(std) 一、vector容器的介绍 引…

07 - 进程创建大盘点

---- 整理自狄泰软件唐佐林老师课程 查看所有文章链接&#xff1a;&#xff08;更新中&#xff09;Linux系统编程训练营 - 目录 文章目录 1. 进程创建回顾2. 再论进程创建2.1 思考2.2 vfork()深度分析2.3 vfork()要点分析2.4 fork()的现代优化2.5 编程实验&#xff1a;fork() &…

【安卓源码】Binder机制2 -- addService 流程

0、binder 进程间通信原理 一次完整的 Binder IPC 通信过程通常是这样&#xff1a; 首先 Binder 驱动在内核空间创建一个数据接收缓存区&#xff1b; 接着在内核空间开辟一块内核缓存区&#xff0c;建立内核缓存区和内核中数据接收缓存区之间的映射关系&#xff0c;以及内核中…

PHP入门【1】环境搭建

目录 一&#xff0c;安装appserv组合包 二&#xff0c;运行第一个php程序 一&#xff0c;安装appserv组合包 组合包&#xff1a;将apache&#xff0c;mysql&#xff0c;php等服务器软件和工具安装配置完成后打包处理 组合包大大提高了我们的效率&#xff0c;不需要为配置环境…

Linux服务器出现503 服务不可用错误怎么办?

​  HTTP 503 服务不可用错误代码表示网站暂时不可用。无论您是网站访问者还是管理员&#xff0c;503 页面都很麻烦。尽管该错误表明存在服务器端问题&#xff0c;但对于访问者和网络管理员来说&#xff0c;有一些可能的解决方案。本文将解释Linux服务器出现503 服务不可用错…