蓝桥杯AcWing 题目题解 - 递归与递推

2023-05-16

目录

AcWing 92. 递归实现指数型枚举

AcWing 93. 递归实现组合型枚举

AcWing 94. 递归实现排列型枚举

 AcWing 1209. 带分数

AcWing 1208. 翻硬币


AcWing 92. 递归实现指数型枚举

从1~n这n个整数中随机选取任意多个,输出所有可能的选择方案。

输入格式
输入一个整数n。
输出格式
每行输出一种方案。
同一行内的数必须升序排列,相邻两个数用恰好1个空格隔开。对于没有选任何数的方案,输出空行。
本题有自定义校验器(SPJ),各行(不同方案)之间的顺序任意。
数据范围
1≤n≤15

输入样例:

3

输出样例:


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

 方法一:暴力

对于每个数都有选or不选两种,所以有2^n种可能

#include <iostream>
using namespace std;
int n;
int main(){
    cin>>n;
    //1<<n位表示2^n可能
    for(int i=0;i<(1<<n);i++){
        for(int j=0;j<n;j++){
            //获得其第j位的数字,若是1就输出
            if(i>>j&1) printf("%d ",j+1);
        }
        printf("\n");
    }
}

方法二:递归

#include <iostream>
using namespace std;

const int N=20;

int n;

bool vis[N]; //判断选还是不选

void DFS(int u) //第几层就是筛选第几个数字
{
    if(u>n) //不可以有等号,如果有等号会少一层递归,即最后一层无法递归 
    {
        for(int i=1;i<=n;i++)//从1到n选择
        if(vis[i])  //把选择的数打印出来
            cout<<i<<" ";
        cout<<endl;
        return ;
    }
    else {
        vis[u]=true;//选这个数字
        DFS(u+1);

        vis[u]=false;//不选这个数字
        DFS(u+1);
    }
}
int main() {
    cin>>n;
    DFS(1);  //从1开始选择,到n结束,所以不能从0开始;
    return 0;
}

 上升序列:

#include<iostream>
using namespace std;

int n;
int a[20];
bool st[20];

//pos为当前枚举到的坑数,start表示只能从start开始找数,一共填tar个坑
void dfs(int pos,int start,int tar)
{
    if(pos==tar+1)
    {
        for(int i=1;i<=tar;i++) cout<<a[i]<<" ";
        cout<<endl;
        return ;
    }
    
    for(int i=start;i<=n;i++)//start保证升序
    {  
        a[pos]=i;
        dfs(pos+1,i+1,tar);
    }
}

int main()
{
    cin>>n;
    for(int i=0;i<=n;i++)
        dfs(1,1,i);
    return 0;
}


AcWing 93. 递归实现组合型枚举

从1~n这n个整数中随机选出m个,输出所有可能的选择方案。
输入格式
两个整数n, m ,在同一行用空格隔开。
输出格式
按照从小到大的顺序输出所有方案,每行1个。
首先,同一行内的数升序排列,相邻两个数用一个空格隔开。
其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面(例如1 3 5 7排在1368前面)。
数据范围n > 0 ,0 <m ≤n ,n+(n -m)≤25
 

输入样例:

5 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 
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=30;
int n,m;
int way[N];

void dfs(int u,int start)
{
    //if (u + n - start < m) return;  // 剪枝
    if(u==m+1)
    {
        for(int i=1;i<=m;i++) cout<<way[i]<<" ";
        puts("");
        return ;
    }
    for(int i=start;i<=n;i++)
    {
        way[u]=i;
        dfs(u+1,i+1);
        way[u]=0;
    }
}
int main()
{
    cin>>n>>m;
    dfs(1,1);
    return 0;
    
}

AcWing 94. 递归实现排列型枚举

把1 ~n这n个整数排成一行后随机打乱顺序,输出所有可能的次序。输入格式
一个整数n。
输出格式
按照从小到大的顺序输出所有方案,每行1个。
首先,同一行相邻两个数用一个空格隔开。
其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面。

输入样例:

3

输出样例:

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

递归

#include<iostream>
using namespace std;
const int N = 10;
int path[N];//保存序列
int state[N];//数字是否被用过
int n;
void dfs(int u)
{
    if(u > n)//数字填完了,输出
    {
        for(int i = 1; i <= n; i++)//输出方案
            cout << path[i] << " ";
        cout << endl;
    }

    for(int i = 1; i <= n; i++)//空位上可以选择的数字为:1 ~ n
    {
        if(!state[i])//如果数字 i 没有被用过
        {
            path[u] = i;//放入空位
            state[i] = 1;//数字被用,修改状态
            dfs(u + 1);//填下一个位
            state[i] = 0;//回溯,取出 i
        }
    }
}

int main()
{

    cin >> n;
    dfs(1);
    return 0;
}

 非递归类型枚举:

C++STL中全排列函数next_permutation

全排列就是一次对对象序列或值序列的重新排列。例如,“ABC”中字符可能的排列是:"ABC", "ACB", "BAC", "BCA", "CAB", "CBA"

next_permutation(num,num+n)函数是对数组num中的前n个元素进行全排列,同时并改变num数组的值。

另外,需要强调的是,next_permutation()在使用前需要对欲排列数组按升序排序,否则只能找出该序列之后的全排列数。

#include <bits/stdc++.h>
using namespace std;
const int N=11;
int n,a[N];
int main() 
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        a[i]=i;
    do
    {
        for(int i=1;i<=n;i++)
            cout<<a[i]<<" ";
        cout<<endl;
    }while(next_permutation(a+1,a+1+n));
    return 0;
}

 AcWing 1209. 带分数

输入样例1:

100

输出样例1:

11

输入样例2:

105

输出样例2:

6

方法一: 暴力        

思路:

全排列1到9

将1-9分为三段

#include<iostream>
#include<algorithm>
using namespace std;
int n;
int a[10]={1,2,3,4,5,6,7,8,9};
int js(int l,int r)
{
    int sum=0;
    for(int i=l;i<=r;i++)
    {
        sum=sum*10+a[i];
    }
    return sum;
}

int main()
{
    cin>>n;
    int cnt=0;
    
    do
    {
        for(int i=0;i<7;i++)
        {
            for(int j=i+1;j<8;j++)
            {
                int a=js(0,i);
                int b=js(i+1,j);
                int c=js(j+1,8);
                if(n*c==a*c+b) cnt++;
            }
        }
        
        
    }while(next_permutation(a,a+9));
    cout<<cnt;
    return 0;
}

方法二:

#include<iostream>
using namespace std;

const int N = 20;
int shu[N];//存放全排列数字
bool st[N];//数字是否出现 
int n;//输入一个数字,验证符合的数字个数 
int cnt;//符合条件的数字个数 

//验证一个排列是否符合 
void yan()
{
    int a = 0,b = 0, c = 0;
    //分成三段
    for(int i = 2; i<9 ; i++)
    {
        for(int j = i+1 ; j<10 ; j++)
        {
            a = 0,b = 0,c = 0;//重新验证新数字 
            for(int x = 1 ; x < i ; x++) a = a * 10 + shu[x]  ; 
            for(int y = i ; y < j ; y++) b = b * 10 + shu[y]  ;
            for(int z = j ; z < 10; z++) c = c * 10 + shu[z]  ;

            //等式要符合,并且要是b和c能整除 
            if(n == a + (b / c)  && b % c == 0) cnt++; 
        }
    } 
}

void dfs(int u)
{
    //处理边界 
    if(u == 10)
    {
        //进行验证数字 
        yan();
        return ; 
    }

    //枚举1 - 9 不重复的数字 
    for(int i = 1 ; i<10 ; i++)
    {
        if(!st[i])
        {
            st[i] = true;
            shu[u] = i;
            dfs(u+1);//递归 
            st[i] = false;//恢复现场 
         } 
    }
}

int main()
{
    cin>>n;

    dfs(1);//从1开始 

    cout<<cnt;//输出符合的个数 

    return 0;
 } 

AcWing 1208. 翻硬币

小明正在玩一个“翻硬币”的游戏。

桌上放着排成一排的若干硬币。我们用 * 表示正面,用 o 表示反面(是小写字母,不是零)。

比如,可能情形是:**oo***oooo

如果同时翻转左边的两个硬币,则变为:oooo***oooo

现在小明的问题是:如果已知了初始状态和要达到的目标状态,每次只能同时翻转相邻的两个硬币,那么对特定的局面,最少要翻动多少次呢?

我们约定:把翻动相邻的两个硬币叫做一步操作。

输入格式

两行等长的字符串,分别表示初始状态和要达到的目标状态。

输出格式

一个整数,表示最小操作步数

数据范围

输入字符串的长度均不超过100。
数据保证答案一定有解。

输入样例1:

**********
o****o****

输出样例1:

5

输入样例2:

*o**o***o***
*o***o**o***

输出样例2:

1

#include<iostream>
#include<cstring>
using namespace std;
char ks[110],js[110];
void  turn(int i)
{
    if(ks[i]=='*') ks[i]='o';
    else ks[i]='*';
}
int main()
{
    cin>>ks>>js;
    int n=strlen(ks);
    int bs=0;
    for(int i=0;i<n;i++)
    {
        if(ks[i]!=js[i])
        {
            turn(i);
            turn(i+1);
            bs++;
        }
    }
    cout<<bs;
    return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

蓝桥杯AcWing 题目题解 - 递归与递推 的相关文章

  • acwing蓝桥杯 - 数学知识【上】

    目录 质数 试除法判定质数 分解质因数 筛质数 约数 试除法求约数 约数个数 约数之和 最大公约数 质数 试除法判定质数 这个算法广为人知 xff0c 这里就不证明了 xff0c 解释一下 i lt 61 n 的写法 1 不推荐写成i lt
  • 蓝桥杯AcWing 题目题解 - 二分与前缀和、差分

    目录 AcWing 789 数的范围 整数二分 AcWing 790 数的三次方根 实数二分 AcWing 730 机器人跳跃问题 二分应用 AcWing 1227 分巧克力 AcWing 795 前缀和 AcWing 796 子矩阵的和
  • acwing蓝桥杯 - 数学知识【下】

    目录 欧拉函数 快速幂 求组合数 I 博弈论 Nim游戏 欧拉函数 在数论 xff0c 对正整数n xff0c 欧拉函数是小于n的正整数中与n互质的数的数目 xff0c 记作 n 1 61 1 1 分解质因子 xff0c 求出质因子p 2
  • AcWing 849. Dijkstra求最短路 I &&II

    给定一个 n 个点 m 条边的有向图 图中可能存在重边和自环 所有边权均为正值 请你求出 1 号点到 n 号点的最短距离 如果无法从 1 号点走到 n 号点 则输出 1 输入格式 第一行包含整数 nn 和 mm 接下来 mm 行每行包含三个
  • 【AcWing】827. 双链表

    双链表 实现一个双链表 双链表初始为空 支持5种操作 在最左侧插入一个数 在最右侧插入一个数 将第 k个插入的数删除 在 第 k个插入的数左侧插入一个数 在第 k个插入的数右侧插入一个数 现在要对该链表进行 M次操作 进行完所有操作后 从左
  • 【蓝桥杯】1246. 等差数列*

    穿越隧道 计算每两项差值之间的最大公因数 最后的值则为数列的等差 include
  • Acwing 1414.牛异或

    输入样例 5 1 0 5 4 2 输出样例 6 4 5 刚开始看到这个题 我是毫无思绪 看了一下题解 https www acwing com video 2339 老师说这个是最大异或对的变形 于是我去找了一下最大异或对 看完之后我只能想
  • 第十四届蓝桥杯.子串简写(前缀和\后缀和)

    程序猿圈子里正在流行一种很新的简写方法 对于一个字符串 只保留首尾字符 将首尾字符之间的所有字符用这部分的长度代替 例如internationalization简写成 i18n Kubernetes 简写成 K8s Lanqiao 简写成
  • AcWing 417. 不高兴的津津

    题目 津津上初中了 妈妈认为津津应该更加用功学习 所以津津除了上学之外 还要参加妈妈为她报名的各科复习班 另外每周妈妈还会送她去学习朗诵 舞蹈和钢琴 但是津津如果一天上课超过八个小时就会不高兴 而且上得越久就会越不高兴 假设津津不会因为其它
  • AcWing 104. 货仓选址

    题目 在一条数轴上有 N 家商店 它们的坐标分别为 A1 AN 现在需要在数轴上建立一家货仓 每天清晨 从货仓到每家商店都要运送一车商品 为了提高效率 求把货仓建在何处 可以使得货仓到每家商店的距离之和最小 输入格式 第一行输入整数N 第二
  • AcWing 3708. 求矩阵的鞍点

    输入样例 3 4 1 2 3 4 1 2 3 4 1 2 3 4 输出样例 1 4 4 2 4 4 3 4 4 include
  • AcWing110. 防晒

    输入样例 3 2 3 10 2 5 1 5 6 2 4 1 输出样例 2 解析 按照右区间排序 优先满足小的 include
  • AcWing4908. 饥饿的牛

    输入样例1 1 5 1 2 输出样例1 2 样例1解释 两捆干草在第 11 天早上被送到了牛棚 所以贝茜第 1 2 天有干草吃 输入样例2 2 5 1 2 5 10 输出样例2 3 样例2解释 两捆干草在第 1 天早上被送到了牛棚 所以贝茜
  • AcWing 861. 二分图的最大匹配

    https www acwing com problem content 863 二分图我不太清楚 我刚做了染色法解决二分图 然后我看了相关资料 https blog csdn net u011815404 article details
  • Acwing796.子矩阵的和

    理解二维前缀和 include
  • 243. 一个简单的整数问题2(树状数组)

    输入样例 10 5 1 2 3 4 5 6 7 8 9 10 Q 4 4 Q 1 10 Q 2 4 C 3 6 3 Q 2 4 输出样例 4 55 9 15 解析 一般树状数组都是单点修改 区间查询或者单点查询 区间修改 这道题都是区间操作
  • Acwing 94. 递归实现排列型枚举

    include
  • Acwing 93. 递归实现组合型枚举

    u n start lt m 为剪枝操作 当前已选择的数 剩下的数 凑不出指定的个数m 直接return include
  • AcWing题解

    104 货仓选址 417 不高兴的津津 421 陶陶摘苹果 425 明明的随机数 429 奖学金 441 数字统计 445 数字反转 449 质因数分解 680 剪绳子 756 蛇形矩阵 1381 阶乘 3208 Z字形扫描 3375 成绩
  • AcWing4118. 狗和猫

    输入样例1 3 6 10 4 0 CCDCDD 4 1 2 0 CCCC 4 2 1 0 DCCD 输出样例1 Case 1 YES Case 2 YES Case 3 NO 样例1解释 在 Case 1 中 一共有 1010 份狗粮和 4

随机推荐

  • 超详细讲解C语言文件操作!!

    超详细讲解C语言文件操作 xff01 xff01 什么是文件文件名 文件的打开和关闭文件指针文件的打开和关闭 文件的顺序读写文件的随机读写fseekftellrewind 文本文件和二进制文件文件读取结束的判定文件缓冲区 什么是文件 磁盘上
  • windows HLK server部署操作步骤

    Windows Hardware Lab Kit HLK 是微软官方提供的一个测试工具组 xff0c 也是windows系统认证工具 The Windows Hardware Lab Kit Windows HLK is a test fr
  • 超详细讲解Java的数据类型与变量

    超详细讲解Java的数据类型与变量 字面常量数据类型变量整型变量长整型变量短整型变量字节型变量 浮点型变量双精度浮点型单精度浮点型 字符型变量布尔型变量 转换自动类型转换 隐式 强制类型转换 显式 类型提升 字面常量 在System Out
  • java.lang.instrument ASSERTION FAILED ***: “error

    java lang instrument ASSERTION FAILED error 61 61 JVMTI ERROR NONE at Reentrancy c line 161 问题记录 应该是jdk版本更新的问题 第一次运行代码时出
  • C语言实现汉诺塔问题(保姆式讲解)

    前言 大家好 xff0c 又是再一次分享文章 xff0c 我十分感谢各位能够点开这篇花费我颇多时间才解决的汉诺塔问题 xff0c 接下来我就要分享一下自己的所思所想 xff0c 希望能给各位带来一些不一样的收获吧 提醒 汉诺塔问题的本质是函
  • Ubuntu20.04下基于ROS和PX4的无人机仿真平台的基础配置搭建(我所遇到的问题)

    写在前面 xff1a 我目前也处于学习阶段 xff0c 当时按照ROS教程安装的20 04 xff0c 随后搭建XTDrone阶段因为版本问题出现了很多问题 xff0c 这是我根据问题 xff0c 检索后汇总的一些解决措施 本文中提到的问题
  • for 循环无限循环ing....

    题目没思路 xff0c 有思路无法各种错误 xff0c 基础不牢 xff0c 程序的本质理解不透彻 头疼
  • ER图学习笔记(附各个图型的举例,实战案例)

    ER图常用图形如下 xff1a ER图图形含义详解 实体 xff08 长方体 xff09 xff1a 实体字面意思就是实际存在的 xff0c 例如商品 xff0c 货物 xff0c 用户 属性 xff08 椭圆 xff09 xff1a 属性
  • Visual Stdio 2022 C语言源文件调试教程

    下面是一个简单的C语言程序 xff0c 我将以它为例说明如何进行VS2022调试 include lt stdio h gt int main int a b sum a float x y sum b scanf s 34 d d 34
  • 选择排序法和冒泡排序法的比较

    本篇以对元素从小到大有序排列为例 xff0c 比较了选择排序法和冒泡排序法的相同点和不同点 同 xff1a 1 循环结构相同 xff1a 均采用了与i有关的for循环和与j有关的for循环的双层嵌套模式 2 最后结果相同 xff1a 均实现
  • Npm包管理版本机制

    Npm是什么 npm是世界上上 xff0c 使用最广泛的软件管理工具 xff0c 是运行时 Node js 的默认程序包管理器 NPM版本机制 版本号规范 npm是通过版本机制来解决的依赖机制 npm的规范的标准版本号采用 X Y Z 的格
  • to String语句的作用和用法

    在 Java 中 xff0c toString 方法是 Object 类中的一个方法 xff0c 用于返回对象的字符串表示 当我们打印一个对象时 xff0c 实际上是调用了该对象的 toString 方法 如果没有重写该方法 xff0c 将
  • KVM 环境搭建(Base on Ubuntu)

    Kernel based Virtual Machine的简称 xff0c 是一个开源的系统虚拟化模块 xff0c 自Linux 2 6 20之后集成在Linux的各个主要发行版本中 Use the latest kernel of the
  • 为什么这里的int型指针变量为8字节

    include lt stdio h gt void test1 int main test1 return 0 void test1 int num 61 100 取变量地址用 amp amp num代表标量的num的起始地址 print
  • C语言字符查找

    include lt string h gt include lt stdio h gt int main void char string 101 gets string char ptr c scanf 34 c 34 amp c pt
  • 使用vs2022遇到的一些问题

    小白的C语言之路 目录 前言 一 vs2022是什么 xff1f 二 我遇到的几个问题 1 字体调整在哪呢 xff1f 2 同一个项目中练习 xff0c 建立了多个源文件怎么办 xff1f 3 不小心关掉了错误列表 xff0c 解决方案资源
  • strtok函数的模拟实现

    本篇文章属于C语言初阶内容 xff0c 请各位读者选择阅读 目录 1 strtok函数 1 1 strtok函数的说明 1 2 strtok函数的模拟实现 1 strtok函数 1 1strtok函数的说明 首先我们来看strtok函数的定
  • Linux权限 - 概念与管理 | 文件权限的修改与转让 【详解】

    目录 Linux权限 Linux权限的概念 Linux权限的基础操作 1 实现用户账号的切换 2 仅提升当前指令的权限 Linux权限管理 1 文件访问者的分类 xff08 人 xff09 2 文件类型和访问权限 xff08 事物属性 xf
  • acwing蓝桥杯 - 数学知识【上】

    目录 质数 试除法判定质数 分解质因数 筛质数 约数 试除法求约数 约数个数 约数之和 最大公约数 质数 试除法判定质数 这个算法广为人知 xff0c 这里就不证明了 xff0c 解释一下 i lt 61 n 的写法 1 不推荐写成i lt
  • 蓝桥杯AcWing 题目题解 - 递归与递推

    目录 AcWing 92 递归实现指数型枚举 AcWing 93 递归实现组合型枚举 AcWing 94 递归实现排列型枚举 AcWing 1209 带分数 AcWing 1208 翻硬币 AcWing 92 递归实现指数型枚举 从1 xf