寒假刷题-递归与递推

寒假刷题

92. 递归实现指数型枚举

image-20240115182149547

image-20240115182203169

解法1递归

使用递归对每一个坑位进行选择,每个坑位有两种选择,填或者不填,使用st数组来记录每个坑位的状态,u来记录已经有多少坑位有了选择。

image-20240115194744258

每个坑位有2钟选择,n个坑位的复杂度就是2的n次方。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 16;
int n;
int st[N];
void dfs(int u){
    if(u>n)
    {
        for(int i = 1;i<=n;i++)
        {
            if(st[i]==1)printf("%d ",i);
        }
        printf("\n");
        return;
    }
    st[u] = 1;
    dfs(u+1);
    st[u]=0;
    dfs(u+1);
}
int main(){
    scanf("%d",&n);
    dfs(1);
    return 0;
}

坑位的下标和这个坑位的数字是存在对应关系的,所以可以用一个u来控制递归的出口。我们只关心u位置是否有数字。
st[u] = 1;
dfs(u+1);
这两句相当于是将这个位置画对勾,然后跳到下一个位置进行选择
st[u]=0;
dfs(u+1);
这两句就是这个位置不填数进入下一轮,顺便回到dfs之前的状态。(这题无所谓)

解法2二进制压缩

1-n的所有整数排列的方案可以看作一个二进制序列,例如1-3的排列中,1 3就对应二进制101。有数字用1表示,没有数字用0表示。
1-n共有2的n次方钟方案。将所有方案数枚举,然后判断位数是否是1。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n;
int main()
{
    scanf("%d",&n);
    for(int i = 0;i < 1<<n;i ++)
    {
        for(int j = 0;j < n;j ++)
        {
            if(i >> j & 1)printf("%d ",j + 1);
        }
        printf("\n");
    }
    return 0;
}

94. 递归实现排列型枚举

这题就是一个全排列问题,和上一题的区别是很明显的。上一个的每个坑位的数字是固定的,可能有或没有,这个题的每个坑位的数是不固定的,且必须有。这个题需要使用st记录是否使用过。这个st和上一个题的st代表的意义不一样。

使用循环来进行dfs。循环从1开始,到n结束。通过st[i]可以知道数字i是否被使用过。如果没被使用过就使用i,然后进入下一层搜索。使用后一定要恢复现场。

image-20240115203650666

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 10;
int m,st[N],ans[N];
int n;
void dfs(int x)
{
    if(x > n) 
    {
       for(int i = 1;i <= n;i ++)
       {
           printf("%d ",ans[i]);
       }
       printf("\n");
    }
 
    for(int i = 1;i <=n;i ++)
    {
        if(!st[i])
        {
            st[i] = 1;
            ans[x] = i;
            dfs(x+1);
            st[i] = 0;
        }
    }
}
int main()
{
    scanf("%d",&n);
    dfs(1);
    return 0;
}

717. 简单斐波那契

image-20240115205913881

使用递推来进行求解,通过观察可以发现这个数列的第n项只与n-1和n-2项有直接关系,所以使用三个变量a b fn,依次向后轮转。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main(){
    int n,fn;
    scanf("%d",&n);
    int a = 0,b = 1;
    for(int i = 1;i <= n;i ++)
    {
        cout<<a<<" ";
        fn = a+b;
        a=b,b=fn;
    }
}

95. 费解的开关

image-20240115210215243

image-20240115210246482

image-20240115210312290

样例

image-20240115210417313

改变右上角的开关

image-20240115210526298

image-20240115210552593

两步即可让所有的灯变亮。

观察题意可以发现能影响灯本身的除了灯自己还有灯上下左右的灯,可以枚举第一行灯的32种按法,记得备份原数组,然后从第一行按到第四行,第i行可以通过第i+1行的灯来控制,遍历完第四行后,看看第五行还有没有灭的灯,如果有的话,那这个方案就是不可行的。因为没有第六行来控制第五行。如果第五行全亮,那这个就是可以调,判断一下和ans哪个更小。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 6;
char g[N][N],backup[N][N];
int n;
int dx[] = {1,-1,0,0,0};
int dy[] = {0,0,-1,1,0};
void turn(int x,int y){
    for(int i = 0;i < 5;i ++)
    {
        int a = x + dx[i];
        int b = y + dy[i];
        if(a < 0 || b < 0 || a > 4 || b > 4)continue;
        g[a][b] ^= 1;
    }
}
int main(){
    scanf("%d",&n);
    while(n --)
    {
        for(int i = 0;i < 5;i ++)scanf("%s",g[i]);
        int ans = 10;
        for(int op = 0;op < 32;op ++)
        {
            memcpy(backup,g,sizeof g);
            int step = 0;
            for(int i = 0;i < 5;i ++)
            {
                if(op >> i & 1)
                {
                    turn(0,i);
                    step ++;
                }
            }
            for(int i = 0;i < 4;i ++)
            {
                for(int j = 0;j < 5;j ++)
                {
                    if(g[i][j] == '0')
                    {
                        turn(i+1,j);
                        step ++;
                    }
                }
            }
            int drak = 0;
            for(int j = 0;j < 5;j ++)
            {
                if(g[4][j] == '0')
                {
                    drak = 1;
                    break;
                }
            }
            if(drak == 0)ans = min(ans,step);
            memcpy(g,backup,sizeof g);
        }
        if(ans > 6)ans = -1;
        cout << ans <<endl;
    }
    return 0;
}

93. 递归实现组合型枚举

image-20240115212247504

image-20240115212301909

这题与全排列的区别就是字典序,只需要在判断是否使用过的时候加上一个判断,条件是当前的i是否大于ans数组的的最后一个元素,大于往里面添加,小于直接就跳过即可。ans数组初始化时要将元素变为-1,否则开头将无法添加。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
const int N = 26;
int n,m;
int ans[N] = {-1},st[N]={0};
void dfs(int c,int m){
    if(c > m)
    {
        for(int i = 1;i <= m; i ++)
        {
            cout << ans[i] << " ";
        }
        cout<<endl;
        return;
    }
    for(int i = c ;i <= n; i ++)
    {
        if(!st[i]&&i > ans[c-1])
        {
          
          ans[c] = i;
          st[i] = 1;
          dfs(c + 1,m);
          st[i] = 0;
        }
       
    }
}
int main(){
    scanf("%d%d",&n,&m);
    dfs(1,m);
    return 0;
}

1209. 带分数

image-20240115212751409

image-20240115212807361

题意是
n = a + b / c n = a + b/c n=a+b/c
等式两边同时×c
c ∗ n = c ∗ a + b c*n = c*a+b cn=ca+b
通过dfs枚举a和c,然后计算出b,然后遍历st数组看看是否b的每一位都没有被用到。

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int N = 30;
int st[N],backup[N];
int n,ans,test;
bool check(int a,int c)
{
    long long b = (long long) n * c -a * c;
    
    if(!a || !b || !c)return false;
   
    memcpy(backup,st,sizeof st);

    while(b)
    {
        int ge = b % 10;
        if(ge == 0 || backup[ge])return false;
        backup[ge] = 1;
        b /= 10;
    }
       
    for(int i = 1;i <= 9;i ++)
    {
        if(backup[i] == 0) return false;
    }
    return true;
}
void dfs_c(int a,int c)
{
    
    if(check(a,c))ans ++;
    for(int i = 1; i <= 9; i ++)
    {
        if(st[i] == 0)
        {
            st[i] = 1;
            dfs_c(a,c*10 + i);
            st[i] = 0;
        }
    }
}
void dfs_a(int a)
{
    
    if(a > n)return;
    if(a)dfs_c(a,0);
    for(int i = 1;i <= 9; i ++)
    {
        if(st[i] == 0)
        {
            st[i] = 1;
            dfs_a(a*10 + i);
            st[i] = 0;
        }
    }
}
int main()
{
    scanf("%d",&n);
    dfs_a(0);
    cout << ans << endl;
    return 0;
}

116. 飞行员兄弟

和费解的开关类似,只不过这个题的数量比较下,所以枚举所有行的全部可能,共65536种,对每一种方案进行操作,记录最少的方案数。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define x first
#define y second
using namespace std;

typedef pair<int,int> PII;
const int N = 5;
char st[N][N],backup[N][N];
vector <PII> ans;
int get(int x,int y)
{
    return x*4 + y;
}
void turn(int x,int y)
{
    if(st[x][y]=='+')st[x][y]='-';
    else st[x][y]='+';
}
void turnall(int x,int y)
{
    for(int i = 0;i < 4;i ++)
    {
        turn(x,i);
        turn(i,y);
    }
    turn(x,y);
}
int main()
{
    for(int i = 0;i < 4;i ++)
    {
        scanf("%s",st[i]);
    }
    for(int i = 0;i < 1 << 16;i ++)
    {
        vector <PII> step;
        memcpy(backup,st,sizeof st);
        for(int x = 0;x < 4;x ++)
        {
            for(int y = 0;y < 4;y ++)
            {
                if(i >> get(x,y) & 1)
                {
                    turnall(x,y);
                    step.push_back({x,y});
                }
            }
        }
        int dark = 0;
        for(int x = 0;x < 4;x ++)
        {
            for(int y = 0;y < 4;y ++)
            {
                if(st[x][y]=='+')
                {
                   dark = 1;
                   break;
                }
            }
        }
        if(dark == 0)
        {
            if(ans.empty()||ans.size() > step.size()) ans = step;
        }
         memcpy(st,backup,sizeof st);
    }
    
    cout << ans.size() << endl;
    for(auto p:ans)
    {
        cout << p.x+1<<" "<<p.y+1<<endl;
    }
    return 0;
}

1208. 翻硬币

有个初始态有个结束态。将初始态与结束态一一对比,遇到不一样的就将移动次数加一并且变换硬币状态。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int ans;
string start,aim;
void turn(int i)
{
    if(start[i]=='*')start[i] = 'o';
    else start[i] = '*';
}
int main()
{
    cin>>start>>aim;
    for(int i = 0;i < start.size() - 1;i ++)
    {
        if(start[i]!=aim[i])turn(i+1),ans++;
        
    }
    cout << ans <<endl;
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于gd32f103移植freemodbus master 主栈

1.移植freemodbus master需要先移植RT-Thread操作系统 GD32F103C8T6移植 RTT Nano 教程-CSDN博客 2.移植freemodbus master协议栈 在移植了RTT以后,我们需要移植就只有串口相关的函数 移植freemodbus master协议栈具体步骤 下载移植freemodbus master协议栈 源码添加协议栈…

PPT 编辑模式滚动页面不居中

PPT 编辑模式滚动页面不居中 目标&#xff1a;编辑模式下适应窗口大小、切换页面居中显示 调整视图大小&#xff0c;编辑模式通过Ctrl 鼠标滚轮 或 在视图菜单中点击适应窗口大小。 2. 翻页异常&#xff0c;调整视图大小后&#xff0c;PPT翻页但内容不居中或滚动&#xff0c…

2024开放式耳机怎么选?最新开放式耳机选购指南,实测避坑!

在音乐的世界中&#xff0c;开放式耳机为听者提供了一种与众不同的聆听体验&#xff0c;它们能够让你更深入地感受音乐&#xff0c;长时间佩戴也更加舒适健康&#xff0c;2024年市场上涌现出了众多优质的开放式耳机&#xff0c;为音乐爱好者提供了丰富的选择&#xff0c;但如何…

AWS CI/CD之三:CodePipeline

前提 在搞定CodeBuild和CodeDeploy之后&#xff0c;就可以配置CodePipeline&#xff0c;这是AWS CI/CD最后一个核心服务了。 1. 设置源 打开CodePipeline主页&#xff0c;开始创建管道&#xff0c;如下图&#xff1a; 管道设置&#xff0c;如下图&#xff1a; 设置源&…

排序:计数排序

目录 思想&#xff1a; 操作步骤&#xff1a; 思路&#xff1a; 注意事项&#xff1a; 优缺点&#xff1a; 代码解析&#xff1a; 完整代码展示&#xff1a; 思想&#xff1a; 计数排序又称为鸽巢原理&#xff0c;是对哈希直接定址法的变形应用。 操作步骤&#xff…

我用 ChatGPT 做了一次探索性数据分析,真的太太太实用了!

ChatGPT 经过短短1年时间的发展&#xff0c;其功能越来越强&#xff0c;现在已经是大多数企业和个人不可或缺的助手。特别是最新的 GPT-4 版本&#xff0c;专门在左边菜单栏给出了两个工具&#xff08;一个是数据分析&#xff0c;另一个是根据文字描述生成图片&#xff09;&…

RT-Thread Studio学习(十六)定时器计数

RT-Thread Studio学习&#xff08;十六&#xff09;定时器计数 一、简介二、新建RT-Thread项目并使用外部时钟三、启用PWM输入捕获功能四、测试 一、简介 本文将基于STM32F407VET芯片介绍如何在RT-Thread Studio开发环境下使用定时器对输入脉冲进行计数。 硬件及开发环境如下…

使用pyechart创建折线图

import json from pyecharts.charts import Line from pyecharts import options# 首先使用文件打开数据 f_us open(Desktop/python/Project/数据可视化/美国.txt,r,encoding"UTF-8") f_rb open(Desktop/python/Project/数据可视化/日本.txt,r,encoding"UTF-8…

springboot106大学城水电管理系统

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的大学城水电管理系统 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 …

密码学学习笔记(二十四):TCP/IP协议栈

TCP/IP协议栈的基础结构包括应用层、传输层、网络层、数据链路层和物理层。 应用层 应用层位于TCP/IP协议栈的最顶层&#xff0c;是用户与网络通信的接口。这一层包括了各种高级应用协议&#xff0c;如HTTP&#xff08;用于网页浏览&#xff09;、FTP&#xff08;用于文件传输…

c# 自定义 滑块TrackBar

辛苦半天做出来的&#xff0c;如果觉得好用&#xff0c;记得点赞 效果图如下&#xff1a; 具体操作&#xff1a; 1 、添加代码&#xff08;代码在下面&#xff09;&#xff0c;重新生成下整个工程&#xff0c;在工具栏中就出现控件&#xff0c;将控件拖到窗体中 2、只需要调整…

【Qt5】QString的成员函数trimmed

2024年1月19日&#xff0c;周五下午 QString 的 trimmed 方法是用于移除字符串两端的空白字符&#xff08;空格、制表符、换行符等&#xff09;的方法。它返回一个新的字符串&#xff0c;该字符串是原始字符串去除两端空白后的结果。 下面是一个简单的示例&#xff1a; #incl…

瑞_Java开发手册_(六)工程结构

文章目录 工程结构的意义(一) 应用分层(二) 二方库依赖(三) 服务器 &#x1f64a;前言&#xff1a;本文章为瑞_系列专栏之《Java开发手册》的工程结构篇&#xff0c;主要介绍应用分层、二方库依赖、服务器。由于博主是从阿里的《Java开发手册》学习到Java的编程规约&#xff0c…

往docker中cloudbeaver的容器添加达梦数据库、impala数据库连接支持(cloudbeaver添加自定义数据连接)

cloudbeaver默认没有开放impala连接&#xff0c;更不会支持国产数据库了 docker安装运行cloudbeaver可以参考文章&#xff1a;docker安装运行CloudBeaver并设置默认语言为中文 本文跳过cloudbeaver镜像拉取&#xff0c;直接就开始实现自定义数据库连接功能 1、初始化cloudbe…

MLILY梦百合上榜“2023中国家居行业价值100公司”

2024年1月16日,由搜狐焦点家居联合搜狐财经、搜狐科技、搜狐时尚等主流频道主办的“2023中国家居行业价值100公司”榜单正式公布。MLILY梦百合作为头部睡眠科技品牌,经线上投票和专家评审,凭借强大的创新力、产品力、品牌力、服务力,从千家候选企业中脱颖而出,并最终荣获“2023…

TLP184(GR-TPL,SE 晶体管输出光电耦合器的特性与概述

TLP184(GR-TPL,SE 是一种交流输入型光电耦合器&#xff0c;由一个光电晶体管组成&#xff0c;该光电晶体管与两个砷化镓红外发射二极管光学耦合。 TLP184(GR-TPL,SE封装在非常小且薄的SO6封装中&#xff0c;具有高抗噪声性和高隔离电压。 由于TLP184(GR-TPL,SE比DIP封装更小&…

navigateTo失效-跳转不了页面解决办法!uniapp\vue

改了一个小时多的错误&#xff0c;跳转页面无论怎么样都跳转不了&#xff0c;有2个问题&#xff1a; 注意&#xff1a;uniapp的报错可以在console里检查&#xff01; 1.pages.json文件没有配置路径&#xff0c; 在pages:[ ]里面加 &#xff08;根据自己的路径进行修改 {&qu…

嵌入式操作教程:7-1 基于CMOS数字摄像头的灰度转换实验

一、实验目的 学习灰度转换的原理&#xff0c;掌握OV2640 摄像头和VPIF总线的工作原理&#xff0c;实现OV2640 摄像头采集图像并进行实时灰度转换显示在 LCD 上。 二、实验原理 OV2640摄像头 OV2640 是世界上第一个 1/4 英寸 2 百万像素视频传感器&#xff0c;同时是 OmniV…

SCSI/UFS储存架构/协议/电源管理/命令处理流程

UFS子系统架构 1.UFS协议 无论是ufs host controller部分还是ufs device部分&#xff0c;他们都将遵循统一的UFS规范 UFS Application Layer(UAP)应用层 1.UFS command set (UCS) UCS处理命令集&#xff0c;如读、写命令等&#xff0c;.使用的命令是简化的SCSI命令&#xff08;…

【01】mapbox js api加载arcgis切片服务

需求&#xff1a; 第三方的mapbox js api加载arcgis切片服务&#xff0c;同时叠加在天地图上&#xff0c;天地图坐标系web墨卡托。 效果图&#xff1a; 形如这种地址去加载http://zjq2022.gis.com:8080/demo/loadmapboxtdt.html 思路&#xff1a; 需要制作一个和天地图比例…