C++U5-第01课-深度优先搜索1

在全排列问题中,使用深度优先搜索(DFS)的思想体现在以下几个方面:

  1. 递归结构:在解决全排列问题的函数中,我们使用了递归调用的方式。通过递归地处理每个位置上的数字,然后继续递归地处理下一个位置上的数字,最终得到完整的排列结果。

  2. 选择与回溯:在每次递归调用中,我们需要做出选择并标记该选择已被使用,然后进行下一层的递归。当递归返回后,我们需要进行回溯操作,即取消前面的选择并恢复为未被使用的状态,以便尝试其他可能性。

  3. 深度遍历:在每次递归时,我们遍历当前节点的所有邻居节点,即可用的数字列表。这样可以在每个位置上选择一个数字,并进一步深入下一层的递归。这种深度优先的遍历方式保证了我们能够探索所有可能的排列情况。

通过以上三个方面,深度优先搜索的思想在全排列问题中得到了体现。这种方法允许我们系统地遍历并尝试所有可能的排列情况,从而求解全排列问题。

 

学习目标

 练习1

小球抽取完放回,输出需要按照字典序从小到大输出,可以直接三层循环枚举每一次抽取的情况,直接输出即可。

【参考代码】
#include<iostream>
#include<algorithm> 
using namespace std;
int main(){
    for(int i = 1; i <= 3; i++){
        for(int j = 1; j <= 3; j++){
            for(int k = 1; k <= 3; k++){
                cout << i << " " << j << " " << k << endl;
            }
        }
    }
    return 0;
}
View Code

 

 练习2

 

思路分析】
小球抽取完放回,输出需要按照字典序从小到大输出,显然写 n 层循环代码量太大。我们考虑递归解决。

dfs(k):第 k 次抽取的过程,对于每一次抽奖,保证字典序,我们从最小的编号开始抽,可以定义一个数组用来存储每次抽的小球编号。当 k==n+1,表示抽奖结束,输出整个过程的小球编号。

1、定义变量n,进行输入

2、递归处理

​ 2.1、结束条件

​ 2.2、从最小的编号开始抽取

【参考代码】
#include<iostream>
#include<algorithm>
using namespace std;
int n , a[19];
void dfs(int k)
{
    //2.1、结束条件 
    if(k == n + 1)
    {
        for(int i = 1; i <= n; i++)
            cout << a[i] << " ";
        cout << endl;
        
        return;
    }
    //2.2、从最小的编号开始抽取 
    for(int i = 1; i <= n; i++)
    {
        a[k] = i;
        dfs(k + 1);
    }    
}
int main()
{
    //1、定义变量n,进行输入 
    cin >> n;
    //2、递归处理 
    dfs(1);
    return 0;
}
View Code

 

从开始后,第一次抽到的结果,然后第二次抽到的结果,直到准备抽第 n + 1 次的时候被阻止了,因为已经抽了 n 次小球了。那么返回,继续第 n 次的其他可能,直到抽尽了第 n 次的所有可能,回到第 n-1 次的时候继续后面可能的小球编号,再抽,直到搜索结束。

 

练习3

 

 搜索标记,bool 数组来帮助,在搜索的过程中就进行标记,判断是否使用过;

第一次1号小球还在,那么取出来,搜索标记 vis[i] 要设置为 true;

第二次,for 循环的时候就会检测到 1 号小球选择过了,那么跳过,i 变成了 2,2可以选,对应标记改变。

第二次抽奖结束后回来第一次,并把搜索标记 1 号 2 号小球取消,所以

记得递归回来后,这个循环 i 号小球已经被放回来了,vis[i] = false,设置为没有选择就可以了

【思路分析】
小球抽取完无放回,输出需要按照字典序从小到大输出,显然写 n 层循环代码量太大。我们考虑递归解决。

dfs(k):第 k 次抽取的过程,对于每一次抽奖,保证字典序,我们从最小的编号开始抽,考虑无放回,我们定义一个标记数组来保证每个小球只拿一次,整个过程定义一个数组用来存储每次抽的小球编号。

当 k==n+1,表示抽奖结束,输出整个过程的小球编号。

1、定义变量n,进行输入

2、递归处理

​ 2.1、结束条件

​ 2.2、从最小的编号开始抽取

​ 2.3、抽取还在箱子里面的小球

【参考代码】
#include<iostream>
#include<algorithm>
using namespace std;
int n , a[19];
bool vis[19];
void dfs(int k)
{
    //2.1、结束条件 
    if(k == n + 1)
    {
        for(int i = 1; i <= n; i++)
            cout << a[i] << " ";
        cout << endl;
        
        return;
    }
    //2.2、从最小的编号开始抽取 
    for(int i = 1; i <= n; i++)
    {
        //2.3、抽取还在箱子里面的小球 
        if(!vis[i])
        {
            a[k] = i;
            vis[i] = true;
            dfs(k + 1);
            vis[i] = false;
        }
    }    
}
int main()
{
    //1、定义变量n,进行输入 
    cin >> n;
    //2、递归处理 
    dfs(1);
    return 0;
}
View Code

 

初赛知识

 计算机软件的含义 (1)运行时,能够提供所要求功能和性能的指令或计算机程序集合。 (2)程序能够满意地处理信息的数据结构。 (3)描述程序功能需求以及程序如何操作和使用所要求的文档。 计算机软件的特点 (1)无形的,没有物理形态,只能通过运行状况来了解功能、特性和质量。 (2)软件渗透了大量的脑力劳动,人的逻辑思维、智能活动和技术水平是软件产品的关键。 (3)软件不会像硬件一样老化磨损,但存在缺陷维护和技术更新。 (4)软件的开发和运行必须依赖于特定的计算机系统环境,对于硬件有依赖性,为了减少依赖,开发中提出了软件的可移植性。 (5)软件具有可复用性,软件开发出来很容易被复制,从而形成多个副本。 总述 按应用范围划分,一般来讲软件被划分为系统软件、应用软件和介于这两者之间的中间件。 系统软件是各类操作系统,如windows、Linux、UNIX等,还包括操作系统的补丁程序及硬件驱动程序,都是系统软件类。 应用软件可以细分的种类就更多了,如工具软件、游戏软件、管理软件等都属于应用软件类。 系统软件 系统软件是负责管理计算机系统中各种独立的硬件,使得它们可以协调工作。系统软件使得计算机使用者和其他软件将计算机当作一个整体而不需要顾及到底层每个硬件是如何工作的。 一般来讲,系统软件包括操作系统和一系列基本的工具(比如编译器,数据库管理,存储器格式化,文件系统管理,用户身份验证,驱动管理,网络连接等方面的工具)。 具体包括以下四类: 1.各种服务性程序,如诊断程序、排错程序、练习程序等; 2.语言程序,如汇编程序、编译程序、解释程序; 3.操作系统; 4.数据库管理系统。  应用软件 应用软件是为了某种特定的用途而被开发的软件。它可以是一个特定的程序,比如一个图像浏览器。也可以是一组功能联系紧密,可以互相协作的程序的集合,比如微软的Office软件。也可以是一个由众多独立程序组成的庞大的软件系统,比如数据库管理系统。 较常见的有: 文字处理软件如WPS、Word等 信息管理软件 辅助设计软件如AutoCAD 实时控制软件如极域电子教室等 教育与娱乐软件

 在计算机中,操作系统是其最基本也是最为重要的基础性系统软件。从计算机用户的角度来说,计算机操作系统体现为其提供的各项服务;从程序员的角度来说,其主要是指用户登录的界面或者接口;如果从设计人员的角度来说,就是指各式各样模块和单元之间的联系。事实上,全新操作系统的设计和改良的关键工作就是对体系结构的设计,经过几十年以来的发展,计算机操作系统已经由一开始的简单控制循环体发展成为较为复杂的分布式操作系统,再加上计算机用户需求的愈发多样化,计算机操作系统已经成为既复杂而又庞大的计算机软件系统之一。 纵观计算机之历史,操作系统与计算机硬件的发展息息相关。操作系统之本意原为提供简单的工作排序能力,后为辅助更新更复杂的硬件设施而渐渐演化。从最早的批量模式开始,分时机制也随之出现,在多处理器时代来临时,操作系统也随之添加多处理器协调功能,甚至是分布式系统的协调功能。其他方面的演变也类似于此。另一方面,个人计算机之操作系统因袭大型机的成长之路,在硬件越来越复杂、强大时,也逐步实现以往只有大型机才有的功能。 从1946年诞生第一台电子计算机以来,它的每一代进化都以减少成本、缩小体积、降低功耗、增大容量和提高性能为目标,随着计算机硬件的发展,同时也加速了操作系统(简称OS)的形成和发展。 主要功能 计算的操作系统对于计算机可以说是十分重要的,从使用者角度来说,操作系统可以对计算机系统的各项资源板块开展调度工作,其中包括软硬件设备、数据信息等,运用计算机操作系统可以减少人工资源分配的工作强度,使用者对于计算的操作干预程度减少,计算机的智能化工作效率就可以得到很大的提升。其次在资源管理方面,如果由多个用户共同来管理一个计算机系统,那么可能就会有冲突矛盾存在于两个使用者的信息共享当中。为了更加合理的分配计算机的各个资源板块,协调计算机系统的各个组成部分,就需要充分发挥计算机操作系统的职能,对各个资源板块的使用效率和使用程度进行一个最优的调整,使得各个用户的需求都能够得到满足。最后,操作系统在计算机程序的辅助下,可以抽象处理计算系统资源提供的各项基础职能,以可视化的手段来向使用者展示操作系统功能,减低计算机的使用难度。 [3] 操作系统主要包括以下几个方面的功能 : ①进程管理,其工作主要是进程调度,在单用户单任务的情况下,处理器仅为一个用户的一个任务所独占, 进程管理的工作十分简单。但在多道程序或多用户的情况 下,组织多个作业或任务时,就要解决处理器的调度、 分配和回收等问题 。 ②存储管理分为几种功能:存储分配、存储共享、存储保护 、存储扩张。 ③设备管理分有以下功能:设备分配、设备传输控制 、设备独立性。 ④文件管理:文件存储空间的管理、目录管理 、文件操作管理、文件保护。 ⑤作业管理是负责处理用户提交的任何要求。

 

本节课作业讲解:

链接:https://pan.baidu.com/s/1sIAVa3ulExo0uyzBGa8Yxg?pwd=z8yh
提取码:z8yh

 

posted @ 2024-01-15 11:20  小虾同学  阅读(8)  评论(0编辑  收藏  举报