dfs (蓝桥备赛)

1、

1317:【例5.2】组合的输出


时间限制: 1000 ms         内存限制: 65536 KB
提交数:52237    通过数: 26231

【题目描述】

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

现要求你用递归的方法输出所有组合。

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

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

【输入】

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

【输出】

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

【输入样例】

5 3

【输出样例】

  1  2  31  2  41  2  51  3  41  3  51  4  52  3  42  3  52  4  53  4  5
#include<iostream>
#include<iomanip> 
using namespace std;
int n,r;
int a[110];
void dfs(int cur,int pre)
{if(cur==r){for(int i=0;i<r;i++){cout<<setw(3)<<a[i];}cout<<endl;return ;}for(int i=pre+1;i<=n;i++){a[cur]=i;dfs(cur+1,i);}
}
int main()
{cin>>n>>r;dfs(0,0);return 0;
}

2、

1318:【例5.3】自然数的拆分


时间限制: 1000 ms         内存限制: 65536 KB
提交数:37561    通过数: 21969

【题目描述】

任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和。

当n=7共14种拆分方法:

7=1+1+1+1+1+1+1
7=1+1+1+1+1+2
7=1+1+1+1+3
7=1+1+1+2+2
7=1+1+1+4
7=1+1+2+3
7=1+1+5
7=1+2+2+2
7=1+2+4
7=1+3+3
7=1+6
7=2+2+3
7=2+5
7=3+4
total=14

【输入】

输入n。

【输出】

按字典序输出具体的方案。

【输入样例】

7

【输出样例】

7=1+1+1+1+1+1+1
7=1+1+1+1+1+2
7=1+1+1+1+3
7=1+1+1+2+2
7=1+1+1+4
7=1+1+2+3
7=1+1+5
7=1+2+2+2
7=1+2+4
7=1+3+3
7=1+6
7=2+2+3
7=2+5
7=3+4
#include<iostream>
using namespace std;
int n;
int a[10010]={1};
void dfs(int cur,int n1)
{if(n1>n){return ;}if(n1==n){cout<<n1<<"="<<a[1];for(int i=2;i<cur;i++){cout<<"+"<<a[i];}cout<<endl;return;}for(int i=a[cur-1];i<n;i++){a[cur]=i;dfs(cur+1,n1+i);}
}
int main()
{cin>>n;dfs(1,0);return 0;
}

3、

 

1212:LETTERS


时间限制: 1000 ms         内存限制: 65536 KB
提交数:43806    通过数: 20134

【题目描述】

给出一个row×col���×���的大写字母矩阵,一开始的位置为左上角,你可以向上下左右四个方向移动,并且不能移向曾经经过的字母。问最多可以经过几个字母。

【输入】

第一行,输入字母矩阵行数R�和列数S�,1≤R,S≤201≤�,�≤20。

接着输出R�行S�列字母矩阵。

【输出】

最多能走过的不同字母的个数。

【输入样例】

3 6
HFDFFB
AJHGDH
DGAGEH

【输出样例】

6
#include<iostream>
#include<cstring>
using namespace std;int r, s, max1 = 0;
char str[30][30];
int u[4] = {1, 0, -1, 0}; // 方向数组
int v[4] = {0, -1, 0, 1};
int visit[30]; // 标记字母是否访问过void dfs(int x, int y, int cur)
{int xn, yn;if (cur > max1){max1 = cur;}for (int i = 0; i < 4; i++){xn = x + u[i];yn = y + v[i];if (xn >= 0 && xn < r && yn >= 0 && yn < s && !visit[str[xn][yn] - 'A']){visit[str[xn][yn] - 'A'] = 1;dfs(xn, yn, cur + 1);visit[str[xn][yn] - 'A'] = 0;}}
}int main()
{cin >> r >> s;for (int i = 0; i < r; i++){cin >> str[i];}memset(visit, 0, sizeof(visit));visit[str[0][0] - 'A'] = 1;dfs(0, 0, 1);cout << max1 << endl;return 0;
}

4、n皇后问题

#include <bits/stdc++.h>
using namespace std;
#define MAXN 35int dx[4]= {1,0,-1,0};
int dy[4]= {0,-1,0,1};
char mp[MAXN][MAXN];
int qizi[MAXN][2];int col[MAXN];
int n,k,cnt;void dfs(int step)
{for(int i=qizi[step-1][0]+1; i<=n-k+step; i++){for(int j=1; j<=n; j++){if(mp[i][j]=='#'&&col[j]==0){col[j]=1;qizi[step][0]=i;if(step==k)cnt++;elsedfs(step+1);col[j]=0;qizi[step][0]=0;}}}return ;
}int main()
{int i,j;cin>>n>>k;while(n!=-1&&k!=-1){memset(qizi,0,sizeof(qizi));memset(col,0,sizeof(col));cnt=0;for(i=1; i<=n; i++){for(j=1; j<=n; j++){cin>>mp[i][j];}}dfs(1);cout<<cnt<<endl;cin>>n>>k;}return 0;
}

5、 

 题目复制有点问题,题目链接:信息学奥赛一本通(C++版)在线评测系统 (ssoier.cn)

1215:迷宫


时间限制: 1000 ms         内存限制: 65536 KB
提交数:70712    通过数: 23046

【题目描述】

一天Extense在森林里探险的时候不小心走入了一个迷宫,迷宫可以看成是由n×n�×�的格点组成,每个格点只有22种状态,.#,前者表示可以通行后者表示不能通行。同时当Extense处在某个格点时,他只能移动到东南西北(或者说上下左右)四个方向之一的相邻格点上,Extense想要从点A走到点B,问在不走出迷宫的情况下能不能办到。如果起点或者终点有一个不能通行(为#),则看成无法办到。

【输入】

第1行是测试数据的组数k�,后面跟着k�组输入。每组测试数据的第11行是一个正整数n(1≤n≤100)�(1≤�≤100),表示迷宫的规模是n×n�×�的。接下来是一个n×n�×�的矩阵,矩阵中的元素为.或者#。再接下来一行是44个整数ha,la,hb,lbℎ�,��,ℎ�,��,描述A处在第haℎ�行, 第la��列,B处在第hbℎ�行, 第lb��列。注意到ha,la,hb,lbℎ�,��,ℎ�,��全部是从00开始计数的。

【输出】

k�行,每行输出对应一个输入。能办到则输出“YES”,否则输出“NO”。

【输入样例】

2
3
.##
..#
#..
0 0 2 2
5
.....
###.#
..#..
###..
...#.
0 0 4 0

【输出样例】

YES
NO
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
char s[105][105];
int n,ha,la,hb,lb,dir[4][2]= {{0,-1},{0,1},{-1,0},{1,0}},flag; //flag标记搜索完毕后是否能到达终点
void dfs(int ha,int la)
{if(ha==hb&&la==lb){cout<<"YES"<<endl;flag=1;}if(flag) return;for(int i=0; i<4; i++){int dx=ha+dir[i][0];int dy=la+dir[i][1];if(dx>=0&&dx<n&&dy>=0&&dy<n&&s[dx][dy]=='.'){s[dx][dy]='#';//只走一次,每个方都要走一遍,只要联通,肯定能到终点dfs(dx,dy);}}
}
int main()
{int k;cin>>k;while(k--){cin>>n;for(int i=0; i<n; i++) for(int j=0; j<n; j++) cin>>s[i][j];cin>>ha>>la>>hb>>lb;if(s[ha][la]=='#'||s[hb][lb]=='#') cout<<"NO"<<endl;//提前判断始点和终点是否符合要求else{flag=0;dfs(ha,la);}if(flag==0) cout<<"NO"<<endl;}return 0;
}

 6、

1218:取石子游戏


时间限制: 1000 ms         内存限制: 65536 KB
提交数:19558    通过数: 9571

【题目描述】

有两堆石子,两个人轮流去取。每次取的时候,只能从较多的那堆石子里取,并且取的数目必须是较少的那堆石子数目的整数倍,最后谁能够把一堆石子取空谁就算赢。

比如初始的时候两堆石子的数目是25和7。

25 7-->11 7-->4 7-->4 3-->1 3-->1 0
选手1取选手2取选手1取选手2取选手1取

最后选手1(先取的)获胜,在取的过程中选手2都只有唯一的一种取法。

给定初始时石子的数目,如果两个人都采取最优策略,请问先手能否获胜。

【输入】

输入包含多数数据。每组数据一行,包含两个正整数a和b,表示初始时石子的数目。

输入以两个0表示结束。

【输出】

如果先手胜,输出"win",否则输出"lose"。

【输入样例】

34 12
15 24
0 0

【输出样例】

win
lose

【提示】

假设石子数目为(a,b)且a >= b,如果[a/b] >= 2则先手必胜,如果[a/b]<2,那么先手只有唯一的一种取法。[a/b]表示a除以b取整后的值。

#include<iostream>
using namespace std;int main()
{int a,b;while(cin>>a>>b){if(!a&&!b)break;int ans=0;int t=max(a,b);b=min(a,b);a=t;while(a%b){if(a/b>1)break;a-=b;swap(a,b);ans++;}if(ans%2)cout<<"lose\n";else cout<<"win\n";}return 0;
}

递归写法

#include<iostream>
using namespace std;int solve(int a,int b,int ans)
{if(a%b==0||a/b>1)return ans;return solve(b,a-b,ans+1);
}
int main()
{int a,b;while(cin>>a>>b){if(!a&&!b)break;if(solve(max(a,b),min(a,b),0)%2)cout<<"lose\n";else cout<<"win\n";}return 0;
}

7、

1219:马走日


时间限制: 1000 ms         内存限制: 65536 KB
提交数:31563    通过数: 16569

【题目描述】

马在中国象棋以日字形规则移动。

请编写一段程序,给定n×m大小的棋盘,以及马的初始位置(x,y),要求不能重复经过棋盘上的同一个点,计算马可以有多少途径遍历棋盘上的所有点。

【输入】

第一行为整数T(T < 10),表示测试数据组数。

每一组测试数据包含一行,为四个整数,分别为棋盘的大小以及初始位置坐标n,m,x,y。(0≤x≤n-1,0≤y≤m-1, m < 10, n < 10)。

【输出】

每组测试数据包含一行,为一个整数,表示马能遍历棋盘的途径总数,0为无法遍历一次。

【输入样例】

1
5 4 0 0

【输出样例】

32
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int n,m,cnt,dir[8][2]= {{-1,-2},{-2,-1},{-2,1},{-1,2},{1,-2},{2,-1},{2,1},{1,2}},vis[10][10];
void dfs(int x,int y,int step)
{if(step==n*m){cnt++;return ;}for(int i=0; i<8; i++){int dx=x+dir[i][0];int dy=y+dir[i][1];if(dx>=0&&dx<n&&dy>=0&&dy<m&&!vis[dx][dy]){vis[dx][dy]=1;dfs(dx,dy,step+1);vis[dx][dy]=0;}}
}
int main()
{int t,x,y;cin>>t;while(t--){cin>>n>>m>>x>>y;memset(vis,0,sizeof(vis));cnt=0;vis[x][y]=1;dfs(x,y,1);cout<<cnt<<endl;}return 0;
}

8、

1221:分成互质组


时间限制: 1000 ms         内存限制: 65536 KB
提交数:17043    通过数: 8686

【题目描述】

给定n个正整数,将它们分组,使得每组中任意两个数互质。至少要分成多少个组?

【输入】

第一行是一个正整数n。1 ≤ n ≤ 10。

第二行是n个不大于10000的正整数。

【输出】

一个正整数,即最少需要的组数。

【输入样例】

6
14 20 33 117 143 175

【输出样例】

3
#include<iostream>
#include<algorithm>
using namespace std;
int n,sum=0;
int a[20];
int visit[20];
int main()
{cin>>n;for(int i=0; i<n; i++){cin>>a[i];}for(int i=0; i<n; i++){if(!visit[i]){visit[i]=1;sum++;for(int j=i+1; j<n; j++){if(!visit[j]&&__gcd(a[i],a[j])==1){a[i]*=a[j];visit[j]=1;}}}}cout<<sum<<endl;return 0;
}

9、题目链接:信息学奥赛一本通(C++版)在线评测系统 (ssoier.cn)

1222:放苹果


时间限制: 1000 ms         内存限制: 65536 KB
提交数:19387    通过数: 12617

【题目描述】

M�个同样的苹果放在N�个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K�表示)5,1,11,5,1 是同一种分法。

【输入】

第一行是测试数据的数目t�(0≤t≤200≤�≤20)。以下每行均包含二个整数M�和N�,以空格分开。1≤MN≤101≤�,�≤10。

【输出】

对输入的每组数据M�和N�,用一行输出相应的K。

【输入样例】

1
7 3

【输出样例】

8
#include<iostream>
using namespace std;
int t,m,n,sum;
void dfs(int cur,int apple,int last)//last当前最少需放置的苹果数(保证后面的盘子苹果数>=前面盘子里的苹果数,排除掉5,1,1和1,5,1 是同一种分法情况)
{int i;if(cur==n&&apple==m){sum++;return;}else if(cur==n||apple>m){return;}else{for(i=last; i<=m; i++){dfs(cur+1,apple+i,i);}}
}
int main()
{cin>>t;while(t--){sum=0;cin>>m>>n;dfs(0,0,0);cout<<sum<<endl;}return 0;
}

 10、寒假作业

#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
typedef long long ll;
ll ans=0;
int a[20]={1,2,3,4,5,6,7,8,9,10,11,12,13};
int b[20];
bool visit[20];
void dfs(int cur,int n)
{if(cur==13){ans++;return;}if(cur==3&&b[0]+b[1]!=b[2]) return;if(cur==6&&b[3]-b[4]!=b[5]) return;if(cur==9&&b[6]*b[7]!=b[8]) return;if(cur==12&&b[11]!=b[9]*b[10]) return;for(int i=0;i<n;i++){if(!visit[i]){visit[i]=true;b[cur]=a[i];dfs(cur+1,n);visit[i]=false;}}
}
int main()
{dfs(0,13);cout<<ans<<endl;return 0;
}

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

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

相关文章

SpringMvc之映射器HandlerMapping

简介 在springmvc的处理流程中&#xff0c;第一步就是查询请求对应的映射器&#xff0c;然后组装成处理器链处理请求&#xff0c;本文意在梳理该过程 重要实现 HandlerMapping是一个接口&#xff0c;该接口用于通过HttpServletRequest寻找对应的处理器&#xff0c;接口介绍如下…

攻防世界逆向刷题

阅读须知&#xff1a; 探索者安全团队技术文章仅供参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作,由于传播、利用本公众号所提供的技术和信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者 本人负责&#xff0c;作者不为此承担任何责任,如…

数据库 表数据添加分页查询 --Java实现

分页数据实体类 public class PageBean implements Serializable {private int rowsPerPage 15;private int rowsNum;//行数private int maxPage;//页数private int pageNum;//页码 } Emp实体类 Data public class Emp implements Serializable {private Long id;private S…

大三实习小菜蛋之JS元素节点

元素节点对象&#xff08;element&#xff09; -在网页中&#xff0c;每一个标签就是一个节点元素 如何获取元素节点对象 1.通过document对象来获取元素节点 2.通过document对象来创建元素节点 通过document来获取已有的元素节点 document.getElementById()-根据id获取一个…

使用`scipy.stats.wasserstein_distance`来计算两个一维分布之间的Earth Mover‘s Distance (EMD)距离

在Python中&#xff0c;计算Earth Mover’s Distance (EMD)通常使用scipy库中的scipy.stats.wasserstein_distance函数&#xff0c;该函数计算的是Wasserstein距离&#xff0c;它与EMD非常相似&#xff0c;都是用来衡量两个分布之间的距离。 以下是一个简单的Python程序例子&a…

超好用的快捷回复软件

随着直播经济和短视频平台的兴起&#xff0c;品牌营销阵地不再局限于传统的电商巨头——淘宝、天猫、京东和拼多多&#xff0c;越来越多的品牌正积极布局快手、抖音等新晋电商平台&#xff0c;同步打造社群矩阵以拓宽产品推广渠道。这种多维度的市场渗透策略有力地提升了品牌的…

C语言看完我这篇编译与链接就够啦!!!

1. 前言 Hello&#xff01;大家好我是小陈&#xff0c;今天来给大家介绍最详细的C语言编译与链接。 2. 编译和链接 我们通常用的编译器&#xff0c;比如Visual Sudio,这样的IDE(集成开发环境&#xff09;一般将编译和链接的过程一步完成&#xff0c;通常将这这种编译和链接合…

算法(6)KMP+trie

KMP&#xff1a; 最浅显易懂的 KMP 算法讲解_哔哩哔哩_bilibili 该视频使用python书写代码&#xff0c;不会python的小伙伴也可以看看了解kmp的大致思路。 问题描述&#xff1a; kmp&#xff1a;字符串匹配算法&#xff0c;用来找一个长字符串中出现了几次小字符串&#xf…

random模块篇

Python 的 random 模块是一个非常实用的工具&#xff0c;它提供了生成各种类型随机数的方法。无论是生成随机整数、浮点数&#xff0c;还是从序列中随机选择元素&#xff0c;random 模块都能满足你的需求。下面是一个详细的教程&#xff0c;介绍 random 模块的主要功能和用法。…

【生成对抗网络GAN】一篇文章讲透~

目录 引言 一、生成对抗网络的基本原理 1 初始化生成器和判别器 2 训练判别器 3 训练生成器 4 交替训练 5 评估和调整 二、生成对抗网络的应用领域 1 图像生成与编辑 2 语音合成与音频处理 3 文本生成与对话系统

【机器学习300问】54、如何找到有效的组合特征?

一、为什么需要去寻找有效的组合特征&#xff1f; 因为并不是所有的特征组合都会意义&#xff0c;都能带来价值。 例如在房价预测场景中&#xff0c;卧室数量和浴室数量的比值有意义&#xff0c;但房屋面积与建造年份相组合作为新的组合特征&#xff0c;可能就没有实际含义&…

【vivado】在原有工程上新建工程

一、前言 在工作中&#xff0c;我们经常需要接触到别人的工程&#xff0c;并在别人的工程上新加设计功能&#xff0c;此时我们需要以别人工程为基础新建工程。 二、在已有工程上新建工程的方法 2.1 vivado 页面file-project-save as... 该方法的优点为&#xff1a;可以直接…

【ORB-SLAM3】在 Ubuntu20.04 上编译 ORM-SLAM3 并使用 D435i、EuRoC 和 TUM-VI 运行测试

【ORB-SLAM3】在 Ubuntu20.04 上编译 ORM-SLAM3 并使用 D435i、EuRoC 和 TUM-VI 运行测试 1 Prerequisites1.1 C11 or C0x Compiler1.2 Pangolin1.3 OpenCV1.4 Eigen3 2 安装 Intel RealSense™ SDK 2.02.1 测试设备2.2 编译源码安装 (Recommend)2.3 预编译包安装 3 编译 ORB-S…

sql常用之CASE WHEN THEN

sql常用之CASE WHEN THEN SQL中的 CASE 类似编程语言里的 if-then-else 语句&#xff0c;用做逻辑判断。可以用于SELECT语句中&#xff0c;也可以用在WHERE&#xff0c;GROUP BY 和 ORDER BY 子句&#xff1b;可以单独使用&#xff0c;也可以和聚合函数结合使用。 语法&#…

PTA L2-037 包装机

一种自动包装机的结构如图 1 所示。首先机器中有 N 条轨道&#xff0c;放置了一些物品。轨道下面有一个筐。当某条轨道的按钮被按下时&#xff0c;活塞向左推动&#xff0c;将轨道尽头的一件物品推落筐中。当 0 号按钮被按下时&#xff0c;机械手将抓取筐顶部的一件物品&#x…

SSM 整合

文章目录 SSM 整合&#xff08;代码配置&#xff09;1. 基本形式2. 无 web.xml 的理论基础3. WebInitializer 替代 web.xml4. SpringWebConfig 替代 spring-web.xml5. 配置『静态资源不拦截』方案一方案二 6. 配置 URL 后缀生效/失效7. 整合 Service 层8. 整合 Dao 层9. Mybati…

07、Lua 流程控制

Lua 流程控制 Lua 流程控制控制结构语句 Lua 流程控制 Lua编程语言流程控制语句通过程序设定一个或多个条件语句来设定。在条件为 true 时执行指定程序代码&#xff0c;在条件为 false 时执行其他指定代码。 以下是典型的流程控制流程图&#xff1a; 控制结构的条件表达式结…

python面试题(1~10)

1、列表&#xff08;list&#xff09;和元组&#xff08;tuple&#xff09;有什么区别&#xff1f; ①列表是不可变的&#xff0c;创建后可以对其进行修改。元组是不可变的&#xff0c;元组一旦创建&#xff0c;就不能对其进行修改。 ②列表表示的顺序&#xff0c;它们是有序…

vscode c++环境配置

1.基础软件安装 安装Visual Studio Code. 安装C拓展。点击在vscode界面最左侧的Extensions图标&#xff08;打开快捷键&#xff1a;ctrlshiftX&#xff09;&#xff0c;搜索“C/C”&#xff0c;点击进行安装。 确保已安装gcc. 一般ubuntu系统会预装gcc.在终端窗口中输入如下…

查立得源码如何去除版权

最近发现很多人百度&#xff1a;查立得源码如何去除版权。 每个源代码/软件都是有版权的&#xff0c;无法去除&#xff0c;我们也得尊重知识产权/劳动成果。 可以去除/修改的是&#xff1a;页面显示的版权信息,查立得底部信息均可自定义(一般conn.php可修改)。 另&#xff1…