【万题详解】DFS搜索专题合集(上)

news2025/1/4 18:56:43

专栏推荐

我的专栏——
专栏链接

1.文章平均质量分 70分以上

2.以洛谷题为基础,解决C++问题

3.有题目、讲解、思路、参考代码……

4. 文章数:29 (2024.3.8)

课前C++小程序(脱控极域电子教室)

这个图标相信现在的学生党没有人想看到
而且每个人都想干掉这款软件,

在这里插入图片描述
今天,喷火龙廖就来聊一下,如何脱控极域电子教室。
那到底该咋做捏?

正片开始

作为编程博主,不如咱先用C++写一遍,看看行不行

#include<bits/stdc++.h>
#include<windows.h>
using namespace std;
int main(){
	Sleep(1000);
	system("TASKKILL /F /IM StudentMain.exe /T");
	return 0;
}

亲测有效,推荐指数:

缺点:紧要关头没有时间编译运行😑

卡BUG(绝对成功)

同样,召唤出粘滞键,
嗯
用鼠标摁住这个界面(不要松),同时按Win+Tab
将粘滞键界面关掉,再次按Win+Tab,并按两下Win键,回到极域界面,会弹出极域崩溃的提示,按退出即可,

 亲测有效,推荐指数:

提示

不会用洛谷的可以看看这篇文章——洛谷使用指南

还有,以下链接是题目的链接。

P1036 [NOIP2002 普及组] 选数

P1706 全排列问题

P1157 组合的输出

P1236 算24点

P1036 [NOIP2002 普及组] 选数

题目描述

已知 n 个整数 1,2,⋯ ,x1​,x2​,⋯,xn​,以及 11 个整数 k(k<n)。从 n 个整数中任选 k 个整数相加,可分别得到一系列的和。例如当 n=4,k=3,4 个整数分别为 3,7,12,19 时,可得全部的组合与它们的和为:

3+7+12=22

3+7+19=29

7+12+19=38

3+12+19=34

现在,要求你计算出和为素数共有多少种。

例如上例,只有一种的和为素数:3+7+19=29。

输入格式

第一行两个空格隔开的整数 n,k(1≤n≤20,k<n)。

第二行 n 个整数,分别为 1,2,⋯ ,x1​,x2​,⋯,xn​(1≤xi​≤5×106)。

输出一个整数,表示种类数。

输入输出样例

输入 #1

4 3
3 7 12 19

输出 #1

1

解题思路

这个题我也是卡了好久,看书的时候突然想到用深度搜索很适合解这道题。 我设置的变量是

  • i,代表第i个数
  • nums,代表已经加了几个数
  • sum,加了nums个数之后的总和
  • ans,要输出的答案,初始化为0

dfs函数如下:dfs(i,nums,sum) 思路是,在面对第i个数时,我们有两种选择,一个是加第i个数,一个是不加第i个数,加的话,我们就把i+1(处理下一个数),sums+1,sum+num[i]放到dfs里递归,不加的话,就把i+1(还是要处理下个数),nums,sum(不用动,因为没有加第i个数)放到dfs里递归。

还有限制条件,如果nums==k时,就代表已经加了k个数,此时检测sum是否是素数,如果是的话,ans++。

还有i要小于等于n。

AC

#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
constexpr int N=25;
int n,k,z=0,s[N],st[N],sum=0,ans=0;
bool pd(int n){
    for(int i=2;i*i<=n;i++){
        if(n%i==0){
            return false;
        }
    }
    return true;
}
void dfs(int u,int sum,int start){
    if(u==k){
        if(pd(sum))
            ans++;
        return;
    }
    for(int i=start;i<n;i++) {
        dfs(u + 1, sum + s[i], i + 1);
    }
        return;
}
int main(){
    scanf("%d%d",&n,&k);
    for(int i=0;i<n;i++){
        scanf("%d",&s[i]);
    }
    dfs(0,0,0);
    printf("%d\n",ans);
    return 0;
}

P1706 全排列问题 

题目描述

按照字典序输出自然数 1 到 n 所有不重复的排列,即 n 的全排列,要求所产生的任一数字序列中不允许出现重复的数字。

输入格式

一个整数 n。

输出格式

由 1∼n 组成的所有不重复的数字序列,每行一个序列。

每个数字保留 55 个场宽。

输入输出样例

输入 #1

3

输出 #1

    1    2    3
    1    3    2
    2    1    3
    2    3    1
    3    1    2
    3    2    1

说明/提示

1≤n≤9。

解题思路

我是用搜索来做的

a数组是用来存放当前选择的排列顺序,b数组则是用来判断当前数是否在a数组中

出现过(其中1表示出现过,0表示未出现过).

本题解思路是这样的:

按1~n的顺序枚举第i位(用搜索来过渡),再逐个判断1~n中哪个数是当前序

列没有出现过的——如果出现过,则将它存储到a数组中,继续下一位的枚举;否

则就继续下一个数的枚举.当第n位枚举完1~n时,就可以直接输出a数组.完事后,

再退回上一位,如果上一位也枚举完1~n后,就再继续退回;如果未枚举完,则把

a的当前位置清空,把b[i]的数变成0(就是代表没有出现过).

最后,如果n位都枚举完1~n之后,就可以stop了...

AC

#include<bits/stdc++.h>
using namespace std;
int a[10],n;
bool vis[10];
void dfs(int u){
	if(u>n){
		for(int i=1;i<=n;i++){
			cout<<setw(5)<<a[i];
		}
		cout<<endl;
		return;
	}
	for(int i=1;i<=n;i++){
		if(!vis[i]){
			a[u]=i;
			vis[i]=1;
			dfs(u+1);
			vis[i]=0;
		}
	}
}
int main(){
	cin>>n;
	dfs(1);
	return 0;
}

P1157 组合的输出

题目描述

排列与组合是常用的数学方法,其中组合就是从 n 个元素中抽出 r 个元素(不分顺序且 r≤n),我们可以简单地将 n 个元素理解为自然数 1,2,…,n,从中任取 r 个数。

现要求你输出所有组合。

例如 n=5,r=3,所有组合为:

123,124,125,134,135,145,234,235,245,345。

输入格式

一行两个自然数 r(1<n<21,0≤r≤n)。

输出格式

所有的组合,每一个组合占一行且其中的元素按由小到大的顺序排列,每个元素占三个字符的位置,所有的组合也按字典顺序。

注意哦!输出时,每个数字需要 33 个场宽。

以 C++ 为例,你可以使用下列代码:

cout << setw(3) << x;

输出占 33 个场宽的数 x。注意你需要头文件 iomanip

输入输出样例

输入 #1

5 3 

输出 #1

  1  2  3
  1  2  4
  1  2  5
  1  3  4
  1  3  5
  1  4  5
  2  3  4
  2  3  5
  2  4  5
  3  4  5

解题思路

这题其实就是搜索+回溯(可是我仍然写了半个多小时)

首先,第一组排列一定是 1∼k(前 k 个元素),于是进行一个预处理;

接下来开始搜:

先从第 k 个元素搜,搜完前 k−1 个元素为 1∼k−1 时最后一个元素的所有情况(边搜边记);

搜完了(前 k 个元素填满了或任意一个元素 >n 了或前 k 个元素未填满,但目前元素已经到 n 了(下一步就没了))就回溯(第一种情况下输出);

共搜 k 次,每次范围向前 1个元素,初始值为 x(目前在搜第几个元素)

搜完了就好了。

AC

#include<bits/stdc++.h>
using namespace std;
int r,a[100],n;
void dfs(int k){
    int i;
    if(k>r){
        for(i=1;i<=r;i++){
            cout<<setw(3)<<a[i];
        }
        cout<<endl;
        return ;
    }
    for(i=a[k-1]+1;i<=n;i++){
        a[k]=i;
        dfs(k+1);
    }
}  
int main()  
{   
    cin>>n>>r;
    dfs(1);
    return 0;  
}  

P1236 算24点 

题目描述

几十年前全世界就流行一种数字游戏,至今仍有人乐此不疲.在中国我们把这种游戏称为“算 24点”。您作为游戏者将得到 4 个 1∼9 之间的自然数作为操作数,而您的任务是对这 4个操作数进行适当的算术运算,要求运算结果等于 24。

您可以使用的运算只有:+,-,*,/您还可以使用 ()来改变运算顺序。注意:所有的中间结果须是整数,所以一些除法运算是不允许的(例如,(2 ×2)/4 是合法的,2×(2/4)是不合法的)。下面我们给出一个游戏的具体例子:

若给出的 4 个操作数是:1 、 2 、 3 、 7,则一种可能的解答是 1+2+3 ×7=24。

输入格式

只有一行,四个1到9之间的自然数。

输出格式

如果有解的话,只要输出一个解。输出的是三行数据,分别表示运算的步骤。

  • 其中第一行是输入的两个数和一个运算符和运算后的结果;

  • 第二行是第一行的结果和一个输入的数据、运算符、运算后的结果,或者是另外两个数的输出结果;

  • 第三行是前面的结果第二行的结果或者剩下的一个数字、运算符和 =24=24。如果两个操作数有大小的话则先输出大的。

如果没有解则输出 No answer!

如果有多重合法解,输出任意一种即可。

注:所有运算结果均为正整数。

输入输出样例

输入 #1

1 2 3 7

输出 #1

2+1=3
7*3=21
21+3=24

解题思路

我的思路是从剩下的数中不断枚举2个数,一一尝试加减乘除四则运算。题目要求从较大数开始输出,我就要求运算时前一个量大于等于(一定要加“等于”!否则60分!)后一个量。然后将结果存在较大量中,并设较小量为已访问。跳过已访问的数,不断从第一个数搜到第四个数搞运算,顺便将运算符号和运算的两个量存起来。当只剩最后一个未访问数时,若其为24,输出即可。

易错点:

1、当4个数中出现两个及以上相同数时,注意两数相同也可以进行运算,但必须保证运算的两个量下标不同。(get60分)

输入:2 2 2 4 输出:2+2=4 4+2=6 6*4=24

2、运算中必须保证只有整除(无余数)。

3、得出的24可以在4个数中的任意一个(要把四个数全搜一遍)

4、运算中不能出现0和负数(特判解决)。

5、可能会出现两个数反复运算(即最后结果被设为已访问),此时特判最后结果未访问即可(get70分)。

6、必须保证24是最后一步算出来的(在运算出结果时判断,若为24则return,get100分)。

输入:1 2 4 6 输出:2-1=1 4*1=4 6*1=24

AC

#include <bits/stdc++.h>
using namespace std;
int a[5];
char opt[5]= {' ','+','-','*','/'};
int F(int x,int k, int y)                                 
{
  if(k==1)
    return x+y;
  if(k==2)
    return max(x,y)-min(x,y);
  if(k==3)
    return x*y;
  return (y==0 || x<y || x%y!=0) ? -999999 : x/y;
}
void Out(int a,int b,int c,int d,int e,int f,int k1,int k2,int k3)
{
  printf("%d%c%d=%d\n",max(a,b),opt[k1],min(a,b),F(max(a,b),k1,min(a,b)));
  printf("%d%c%d=%d\n",max(c,d),opt[k2],min(c,d),F(max(c,d),k2,min(c,d)));
  printf("%d%c%d=%d\n",max(e,f),opt[k3],min(e,f),F(max(e,f),k3,min(e,f)));
  exit(0);                                                  
}
int main()
{
  scanf("%d%d%d%d", &a[1],&a[2],&a[3],&a[4]);
  sort(a+1,a+5);                                           
  do
  {
    for (int i = 1; i <= 4; i++)                            
      for (int j = 1; j <= 4; j++)
        for (int k = 1; k <= 4; k++)
            if (F(F(F(a[1],i,a[2]),j,a[3]),k,a[4])==24)       //((a?b)?c)?d
                Out(a[1],a[2],F(a[1],i,a[2]),a[3],F(F(a[1],i,a[2]),j,a[3]),a[4],i,j,k);
            else if (F(F(a[1],i,a[2]),k,F(a[3],j,a[4])) == 24)//(a?b)?(c?d)
                Out(a[1],a[2],a[3],a[4],F(a[1],i,a[2]),F(a[3],j,a[4]),i,j,k);
  }while (next_permutation(a + 1, a + 5));
  puts("No answer!");
  return 0;
}

结尾

希望大家多多关注!!!

如果你能支持一下我,我十分感谢!!!

如果有人想在洛谷上做题,可以点下方链接:

https://www.luogu.com.cn/

如果你喜欢或想了解一下其他的算法,可以看看以下这些:

洛谷指南

洛谷使用指南_洛谷怎么看-CSDN博客

题目详解系列(部分):

【万题详解】P1314 [NOIP2011 提高组] 聪明的质监员-CSDN博客

【万题详解】洛谷P1282 多米诺骨牌-CSDN博客

【万题详解】洛谷P1238 走迷宫-CSDN博客

【万题详解】洛谷P1135奇怪的电梯-CSDN博客

【万题详解】洛谷P1510 精卫填海-CSDN博客

【万题详解】洛谷P1252 马拉松接力赛-CSDN博客

【万题详解】洛谷P1359 租用游艇-CSDN博客

【百题详解】洛谷P8508 做不完的作业-CSDN博客

【万题详解1】洛谷P1230 智力大冲浪-CSDN博客

【全网首发】洛谷贪心题解合集2-CSDN博客

【全网首发】洛谷贪心题解集合-CSDN博客

洛谷二分题集(3题)-CSDN博客

游戏系列:

C++棋类小游戏2-CSDN博客

C++自创棋类小游戏-CSDN博客

C++:史上最坑小游戏-CSDN博客

 C++:自创小游戏-CSDN博客

C++:下雪-CSDN博客

C++讲解系列(算法):

C++:第十五讲高精度算法-CSDN博客

C++:第十四讲动态规划初步-CSDN博客

C++:第十三讲BFS广度优先搜索-CSDN博客

C++:第十二讲DFS深搜(二)_c++匿名函数dfs-CSDN博客

 C++:第十一讲DFS深搜-CSDN博客

C++:第十讲二分查找-CSDN博客

前缀和与差分:

C++:第九讲前缀和与差分-CSDN博客

贪心:

C++:第八讲贪心算法1-CSDN博客

C++讲解系列(基础入门):

排序:

C++:第七讲冒泡排序-CSDN博客

函数:

C++第6讲max和min函数_c++ min函数-CSDN博客

C++第五讲函数初步-CSDN博客

for循环&数组:

C++第四讲for循环及数组-CSDN博客

if语句&else语句及运算:

C++第三讲:C++中的逻辑运算符及if else语句-CSDN博客

基础:

C++第二讲输入与输出-CSDN博客

C++第一讲认识C++编译器-CSDN博客

欢迎收看,希望大家能三连!

最后认识一下,我是爱编程的喷火龙廖,我们有缘再见!

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

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

相关文章

‘老生常谈’ - 图书管理系统

在软件开发中&#xff0c;增、删、改、查这几个业务非常常见 增 基于axios从服务器拿到需要数据&#xff0c;进行渲染、封装&#xff0c;新增数据并不是一条一条渲染&#xff0c;而是整体重新渲染&#xff1b; 对于该系统新增数据&#xff1a;收集表单数据、提交服务器保存 -…

C++ 实战项目之 Boost 搜索引擎

项目地址&#xff1a;https://gitee.com/Vertas/boost-searcher-project 1. 项目背景 日常生活中我们使用过很多搜索引擎&#xff0c;比如百度&#xff0c;搜狗&#xff0c;360搜索等。我们今天是要实现一个像百度这样的搜索引擎嘛&#xff1f;那是不可能的&#xff0c;因为像…

听 GPT 讲 client-go 源代码 (24)

分享更多精彩内容&#xff0c;欢迎关注&#xff01; File: client-go/applyconfigurations/batch/v1/jobstatus.go 在client-go的applyconfigurations/batch/v1/jobstatus.go文件中&#xff0c;定义了与Job的状态相关的配置和操作。 文件中定义了以下几个结构体&#xff1a; Jo…

投标中项目组织结构的设置以及调整(样式表,多级列表)

投标中项目组织结构的设置以及调整&#xff08;样式表&#xff0c;多级列表&#xff09;&#xff1a; 投标项目中需要处理大规模的文字排版&#xff0c;就是需要用到样式表&#xff08;解决层级关系&#xff09;&#xff0c;多级列表&#xff08;解决自动编号的问题&#xff0…

WatiN——Web自动化测试(三)【弹出窗口处理】

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

Day25:安全开发-PHP应用文件管理模块包含上传遍历写入删除下载安全

目录 PHP文件操作安全 文件包含 文件删除 文件编辑 文件下载 云产品OSS存储对象去存储文件(泄漏安全) 思维导图 PHP知识点 功能&#xff1a;新闻列表&#xff0c;会员中心&#xff0c;资源下载&#xff0c;留言版&#xff0c;后台模块&#xff0c;模版引用&#xff0c;框…

7个实用的CSS技巧

1. First letter drop 首字母丢失 我们可以使用 :first-letter 来删除文本的第一个字母&#xff1a; p:first-letter {font-size: 200%;color: #8A2BE2; }:first-letter 选择器用于指定元素的首字母样式&#xff0c;它仅适用于块级元素。效果如下: codepen.io/OMGZui/pen/… …

Qt 5.14.2 网络编程揭秘:构建高效HTTP客户端与文件下载器

引言 在当今的软件开发世界中&#xff0c;网络通信已成为不可或缺的一部分。Qt&#xff0c;作为一个跨平台的C框架&#xff0c;为我们提供了强大的网络编程能力。本文将带你深入Qt的网络模块&#xff0c;探索如何使用QNetworkAccessManager、QNetworkRequest和QNetworkReply等核…

读《文明之光》第1册总结

人类几千年的文明史和地球的历史相比&#xff0c;实在是太短暂了&#xff0c;大约相当于几分钟和一年的关系。人类已经走过的路&#xff0c;相比今后要走的漫漫长路&#xff0c;只能算是刚刚起步。如果跳出一个个具体事件&#xff0c;站在历史的高度去看&#xff0c;我们会发现…

找出单身狗1,2

目录 1. 单身狗12. 单身狗2 1. 单身狗1 题目如下&#xff1a; 思路&#xff1a;一部分人可能会使用对数组排序&#xff0c;遍历数组的方式去找出只出现一次的数字&#xff0c;但这种方法的时间复杂度过高&#xff0c;有时候可能会不满足要求。 有一种十分简便的方法是使用异或…

类与对象(三)--static成员、友元

文章目录 1.static成员1.1概念&#x1f3a7;面试题✒️1.2static的特性&#x1f3a7;1.3思考&#x1f3a7; 2.友元2.1什么是友元&#xff1f;&#x1f3a7;2.2两种友元关系&#xff1a;&#x1f3a7; 1.static成员 1.1概念&#x1f3a7; &#x1f50e; static关键字用于声明类…

Python教程,python从入门到精通 第1天 温习笔记

1.1 字面量 1.2 注释 1.3 变量 1.4 数据类型 1.5 数据类型转换 1.6 标识符 1.7 运算符 1.8 字符串的三种定义方式 1.9 字符串拼接 1.10 字符串格式化 1.11 掌握格式化字符串的过程中做数字的精度控制 1.12 掌握快速字符串格式化的方式 1.13 字符串格式化&#xff0d;表达式的格…

动态规划基础模型总结

前言 动态规划是用一个数来表示一堆状态&#xff0c;可以看成是对暴搜的优化 暴搜一个一个数枚举过去&#xff0c;但DP是一堆堆数枚举&#xff0c;效率会快很多&#xff1b; 状态数用几维表示&#xff1a;从小到大考虑&#xff0c;看怎么样才能够让答案清楚表达出来 需要一定的…

下载一些ROS的包的方式

ROS Index 我们可以去ROS Index网站下载一些我们需要的包。打开浏览器在网址框输入index.ros.org。或者点击此处链接ROS Index 在这个网站中我们可以浏览并找到我们需要的包&#xff0c;也可以下载它的源代码或者仅安装到我们的系统中来使用。&#xff08;安装过程在终端中进行…

LeetCode的使用方法

LeetCode的使用方法 一、LeetCode是什么&#xff1f;1.LeetCode简介2.LeetCode官网 二、LeetCode的使用方法1.注册账号2.力扣社区力扣编辑器 2.1 讨论发起讨论参与讨论关注讨论 2.2 文章撰写文章关注文章 3.力扣面试官版测评面试招聘竞赛 4.力扣学习LeetBook 书架我的阅读猜您喜…

【PyTorch】进阶学习:探索BCEWithLogitsLoss的正确使用---二元分类问题中的logits与标签形状问题

【PyTorch】进阶学习&#xff1a;探索BCEWithLogitsLoss的正确使用—二元分类问题中的logits与标签形状问题 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、Py…

智能指针基础知识【C++】【RAII思想 || unique_ptr || shared_ptrweak_ptr || 循环引用问题】

目录 一&#xff0c;为什么需要智能指针 二&#xff0c;内存泄露的基本认识 1. 内存泄露分类 2. 常见的内存检测工具 3&#xff0c;如何避免内存泄露 三&#xff0c;智能指针的使用与原理 1. RAII思想 2. 智能指针 &#xff08;1. unique_ptr &#xff08;2. shared_…

【重制版】WSDM 2024 2023时空时序论文总结

&#x1f31f;【紧跟前沿】“时空探索之旅”与你一起探索时空奥秘&#xff01;&#x1f680; 欢迎大家关注时空探索之旅 WSDM 2024于2024年3月4日-3月8日在墨西哥梅里达&#xff08;Mrida, Mxico&#xff09;正在举行。目前官网已经放出了所有被录用论文的表单&#xff08;链接…

2024037期传足14场胜负前瞻

2024037期售止时间为3月9日&#xff08;周六&#xff09;20点00分&#xff0c;敬请留意&#xff1a; 本期深盘多&#xff0c;1.5以下赔率4场&#xff0c;1.5-2.0赔率5场&#xff0c;其他场次是平半盘、平盘。本期14场整体难度中等。以下为基础盘前瞻&#xff0c;大家可根据自身…

干货 | MSC细胞培养 “秘籍”

MSC培养细节&#xff0c;这里有您想知道的~ MSC&#xff1a;间充质干细胞&#xff0c;是一群贴壁生长、形态类似于成纤维细胞的多能成体干细胞&#xff0c;存在于脐带、骨髓和脂肪组织等多种组织中&#xff0c;并且可以分化成多种不同的组 实验数据分享 1、样本&#xff1a;冻…