枚举与尺取法(蓝桥杯 c++ 模板 题目 代码 注解)_蓝桥杯大赛c c+

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

排列型枚举(全排列)模板:

题目一(公平抽签 排列组合):

​编辑 代码:

题目二(座次问题 全排列):

代码:

题目三(排列序数):

代码:

题目四( 美丽的区间 尺取法):

代码:

题目五(奇怪的动物园 尺取法):

代码:

组合型枚举(排列组合模板({C_{n}}^{m})):

#include <iostream>//排列组合
#include <vector>
using namespace std;
int n, m;
vector<int> chosen;
void calc(int k)
{
	if ((chosen.size() > m) || (chosen.size() + n - k + 1) < m)//选太多了,选太少了,chosen.size()表示选了几个
		return;
	if (k == n + 1)//最后一个数都已经选完了
	{
		for (int i = 0; i < chosen.size(); i++)
			cout << chosen[i]<<" ";//输出第i个为几
		cout << endl;
		return;
	}
	chosen.push_back(k);//选数字k
	calc(k + 1);//继续往深度遍历
	chosen.pop_back();//不选数字k
	calc(k + 1);//继续往深度遍历
}
int main()
{
	cin >> n >> m;
	calc(1);//从一开始
}

排列型枚举(全排列)模板:

#include <iostream>//排列型枚举,全排列
#include <vector>
using namespace std;
int n;
int chosen[20];
int book[20] = { 0 };
void calc(int k)
{
	if (k == n + 1)//最后一个数都已经选完了
	{
		for (int i = 1; i <= n; i++)
			cout << chosen[i]<<" ";//输出第i个为几
		cout << endl;
		return;
	}
	for (int i = 1; i <= n; i++)
	{
		if (book[i])//标记是否用过
			continue;
		book[i] = 1;//标记为用了
		chosen[k] = i;//第k个为数字i
		calc(k + 1);//继续往深度遍历
		book[i] = 0;//回溯,没访问过i
		chosen[k] = 0;
	}
}
int main()
{
	cin >> n;
	calc(1);//从一开始
}

题目一(公平抽签 排列组合):

代码:

#include<iostream>
#include<vector>
using namespace std;
int n, m;
vector<int> chosen;
vector<string> name;
void calc(int k)
{
    if (chosen.size() > m || chosen.size() + (n - k + 1) < m)//选多了或者选少了,chosen.size()表示选了几个
        return;
    if (k == n + 1)//最后一个也已经选完了
    {
        for (int i = 0; i < chosen.size(); i++)
            cout << name[chosen[i]-1] << " ";
        cout << endl;
    }
   chosen.push_back(k);//选数字k
	calc(k + 1);//继续往深度遍历
	chosen.pop_back();//不选数字k
	calc(k + 1);//继续往深度遍历
}
int main()
{
    cin >> n >> m;
    for (int i = 0; i < n; i++)
    {
        string s;
        cin >> s;
        name.push_back(s);
    }
    calc(1);
}

题目二(座次问题 全排列):

代码:

#include<iostream>
#include<vector>
using namespace std;
int n;
int chosen[15];
int book[15];//标记是否访问过
string name[15];
void calc(int k)
{
    if (k == n + 1)//最后一个数都已经选完了
    {
        for (int i = 1; i <= n; i++)//输出该排列
        {
            cout << name[chosen[i] - 1] << " ";//name下标从0开始
        }
        cout << endl;
        return;
    }
    for (int i = 1; i <= n; i++)
    {
        if (book[i])//标记是否用过
                 continue;
            book[i] = 1;//标记为用了
            chosen[k] = i;//第k个为数字i
            calc(k + 1);//继续往深度遍历
            book[i] = 0;//回溯,没访问过i
            chosen[k] = 0;
    }
}
int main()
{
    cin >> n;
    for (int i = 0; i < n; i++)
    {
        cin >> name[i];
    }
    calc(1);//从第一个开始
}

题目三(排列序数):

代码:

img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

N6oby4-1715883148541)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上C C++开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以戳这里获取

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值