2026年NOIP普及组初赛基础算法枚举模拟练习题_第1页
2026年NOIP普及组初赛基础算法枚举模拟练习题_第2页
2026年NOIP普及组初赛基础算法枚举模拟练习题_第3页
2026年NOIP普及组初赛基础算法枚举模拟练习题_第4页
2026年NOIP普及组初赛基础算法枚举模拟练习题_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

2026年NOIP普及组初赛基础算法(枚举/模拟)练习题一、枚举与简单模拟(共3题,每题10分)题目1:数字排列问题问题描述:给定一个长度为n的数字序列,请编写程序找出所有可能的排列组合,并按字典序从小到大输出。例如,当n=3,数字序列为[1,2,3]时,输出应为:123132213231312321输入格式:第一行输入一个整数n(1≤n≤5),第二行输入n个互不相同的数字,数字范围在1到10之间。输出格式:按字典序从小到大输出所有排列组合,每个排列占一行。示例输入:3123示例输出:123132213231312321题目2:密码破解(模拟)问题描述:某系统使用4位数字密码进行验证,密码的每一位数字均不相同,且每位数字在密码中只能出现一次。现给定一个密码的候选数字列表,请模拟所有可能的密码组合,并统计其中符合密码规则的组合数量。例如,若候选数字为[1,2,3,4],则符合密码规则的组合数量为24(即所有排列组合)。输入格式:第一行输入一个整数m(2≤m≤10),表示候选数字的数量。第二行输入m个互不相同的数字,数字范围在0到9之间。输出格式:输出一个整数,表示符合密码规则的组合数量。示例输入:41234示例输出:24题目3:路径计数(模拟)问题描述:给定一个3×3的网格,起点为左上角(1,1),终点为右下角(3,3)。从起点出发,每次只能向右或向下移动一步,请计算从起点到终点的所有可能路径数量。例如,在3×3网格中,共有6条路径。输入格式:无需输入,固定为3×3网格。输出格式:输出一个整数,表示从起点到终点的所有可能路径数量。示例输出:6二、枚举与简单模拟(共4题,每题12分)题目4:学生分组问题问题描述:某班级有n名学生,需要将他们分成若干个小组,每组至少有2名学生,且每组学生的学号不重复。现给定学生学号列表,请计算所有可能的分组方案数量。例如,当n=4,学号为[1,2,3,4]时,可能的分组方案有:-[[1,2],[3,4]]-[[1,3],[2,4]]-[[1,4],[2,3]]输入格式:第一行输入一个整数n(2≤n≤10),表示学生数量。第二行输入n个互不相同的整数,表示学生学号。输出格式:输出一个整数,表示所有可能的分组方案数量。示例输入:41234示例输出:3题目5:数字和组合(枚举)问题描述:给定一个正整数n和两个正整数a、b(1≤a≤b≤n),请计算所有满足以下条件的组合数量:组合中的每个数字均不大于n,且组合中所有数字的和在a到b之间。例如,当n=5,a=3,b=7时,满足条件的组合有:-[3]-[4]-[5]-[3,4]-[3,5]-[4,5]-[3,4,5]输入格式:三行输入,第一行输入整数n,第二行输入整数a,第三行输入整数b。输出格式:输出一个整数,表示满足条件的组合数量。示例输入:537示例输出:7题目6:字母排列(枚举)问题描述:给定一个由小写字母组成的字符串,请计算所有可能的字母排列组合,并按字典序从小到大输出。例如,当字符串为"abc"时,输出应为:abcacbbacbcacabcba输入格式:第一行输入一个字符串,字符串长度不超过6个字母,且所有字母互不相同。输出格式:按字典序从小到大输出所有排列组合,每个排列占一行。示例输入:abc示例输出:abcacbbacbcacabcba题目7:迷宫路径(模拟)问题描述:给定一个4×4的迷宫,迷宫中有若干障碍物(用'#'表示),起点为左上角('S'),终点为右下角('E')。从起点出发,每次只能向右或向下移动一步,不能穿过障碍物,请计算从起点到终点的所有可能路径数量。例如,在4×4迷宫中,若迷宫布局如下:S0000#0#00#E则可能的路径数量为2。输入格式:五行输入,每行4个字符,表示迷宫布局。其中'S'表示起点,'E'表示终点,'0'表示可通行路径,'#'表示障碍物。输出格式:输出一个整数,表示从起点到终点的所有可能路径数量。示例输入:S0000#0#00#E示例输出:2答案与解析题目1:数字排列问题答案:cppinclude<iostream>include<vector>include<algorithm>usingnamespacestd;intmain(){intn;cin>>n;vector<int>nums(n);for(inti=0;i<n;++i)cin>>nums[i];sort(nums.begin(),nums.end());do{for(autonum:nums)cout<<num;cout<<endl;}while(next_permutation(nums.begin(),nums.end()));return0;}解析:使用`std::next_permutation`函数可以方便地生成所有排列组合,按字典序从小到大排列。首先对数字序列进行排序,然后通过循环调用`next_permutation`生成下一个排列,直到所有排列生成完毕。题目2:密码破解(模拟)答案:cppinclude<iostream>include<vector>usingnamespacestd;intmain(){intm;cin>>m;vector<int>nums(m);for(inti=0;i<m;++i)cin>>nums[i];sort(nums.begin(),nums.end());intcount=0;do{count++;}while(next_permutation(nums.begin(),nums.end()));cout<<count<<endl;return0;}解析:与题目1类似,通过`next_permutation`生成所有排列组合,并统计排列的数量。初始时对候选数字进行排序,然后通过循环生成所有排列,每次调用`next_permutation`后计数器加1,最终输出计数器的值。题目3:路径计数(模拟)答案:cppinclude<iostream>usingnamespacestd;intmain(){cout<<6<<endl;return0;}解析:在3×3网格中,从起点到终点只能向右或向下移动,路径数量为组合数C(5,2)或C(5,3),即6条路径。直接输出6即可。题目4:学生分组问题答案:cppinclude<iostream>include<vector>include<algorithm>usingnamespacestd;intmain(){intn;cin>>n;vector<int>nums(n);for(inti=0;i<n;++i)cin>>nums[i];sort(nums.begin(),nums.end());intcount=0;for(inti=1;i<n-1;++i){for(intj=i+1;j<n;++j){count++;}}cout<<count<<endl;return0;}解析:将问题转化为组合问题。对于n个学生,选择2个学生作为一组,其余学生自动分组。因此,只需计算从n个学生中选择2个学生的组合数,即C(n,2)。通过两层循环枚举所有可能的组合,并计数。题目5:数字和组合(枚举)答案:cppinclude<iostream>include<vector>usingnamespacestd;intmain(){intn,a,b;cin>>n>>a>>b;intcount=0;for(inti=a;i<=b;++i){vector<int>nums;for(intj=1;j<=n;++j){if(i-j>=0)nums.push_back(j);}for(intmask=0;mask<(1<<n);++mask){intsum=0;for(intj=0;j<n;++j){if(mask&(1<<j))sum+=nums[j];}if(sum==i)count++;}}cout<<count<<endl;return0;}解析:通过两层循环枚举所有可能的数字和(从a到b),对于每个数字和,枚举所有可能的数字组合,并检查组合的和是否等于当前数字和。使用位运算枚举组合,每个位表示一个数字是否被选中。题目6:字母排列(枚举)答案:cppinclude<iostream>include<string>include<algorithm>usingnamespacestd;intmain(){strings;cin>>s;sort(s.begin(),s.end());do{cout<<s<<endl;}while(next_permutation(s.begin(),s.end()));return0;}解析:与题目1类似,使用`std::next_permutation`生成所有排列组合,按字典序从小到大输出。首先对字符串进行排序,然后通过循环调用`next_permutation`生成下一个排列,直到所有排列生成完毕。题目7:迷宫路径(模拟)答案:cppinclude<iostream>include<vector>usingnamespacestd;intmain(){vector<string>maze(4);for(inti=0;i<4;++i)cin>>maze[i];intcount=0;vector<pair<int,int>>directions={{1,0},{0,1}};function<void(int,int)>dfs=[&](intx,inty){if(x==3&&y==3){count++;return;}for(autodir:directions){intnx=x+dir.first,ny=y+dir.second;if(nx>=0&&nx<4

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论