于航特训课第二课

蓝桥杯算法特训第二课【递归原理与构造技巧】源代码

三月 7, 2018小蓝

【内容简介】
本文章内容为【2018蓝桥杯大赛算法特训(软件)系列课程】第二课【递归原理与构造技巧】中涉及到的课上例题的代码实现,加入赛前算法特训获取全部课程内容请联系【小蓝】。



【课程中涉及的源代码】
1. 串的翻转
【问题描述】
【源代码】
【JAVA:于航】


1
2
3
4
5
6
7
8
9
10
11

public class A
{
    static String f(String s){
        if(s.length()<=1) return s;
        return f(s.substring(1)) + s.charAt(0);
    }
    
    public static void main(String[] args){
        System.out.println(f("abcde"));
    }
}

【C:志愿者】


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

#define _CRT_SECURE_NO_WARNINGS
#include 
#include 
#include

char * f(char * s, int num)
{
    if (num <= 1)
    {
        return s;
    }
    else
    {
        char *p = (char *)malloc(num+1);
        memset(p, 0, num+1);
        strcpy(p, s+1);
        char *pp = f(p, num-1);         
        strcpy(p, pp);
        if (p!=pp)
            free(pp);
        strncpy(p+num-1,s,1);       
        return p;
    }
}

void main()
{
    char arr[100] = "abcde";
    printf("%s", f(arr, 5));

}



2. 循环改递归
【问题描述】
【源代码】
【JAVA:于航】


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

public class A
{
    static void f(int a, int b){
        for(int i=a; i<=b; i++){
            System.out.println(i);
        }
    }
    
    static void g(int a, int b){
        if(a<b) g(a,b-1);
        System.out.println(b);
    }
    
    public static void main(String[] args){
        //f(1,10);  
        g(1,10);
    }
}

【C语言:志愿者】


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

#define _CRT_SECURE_NO_WARNINGS
#include 
#include 
#include

void f2(int a, int b)
{
    for (int i = a; i <= b; i++){
        printf("%d ",i);
    }
}

void g2(int a, int b)
{
    if (a < b) 
        g2(a, b - 1);
    printf("%d   ",b);
}

void main()
{
    //f2(1,10); 
    g2(1, 10);
}



3. 出栈次序
【问题描述】
X星球特别讲究秩序,所有道路都是单行线。
一个甲壳虫车队,共16辆车,按照编号先后发车,夹在其它车流中,缓缓前行。
路边有个死胡同,只能容一辆车通过,是临时的检查站,如图所示。

X星球太死板,要求每辆路过的车必须进入检查站,也可能不检查就放行,也可能仔细检查。
如果车辆进入检查站和离开的次序可以任意交错。那么,该车队再次上路后,可能的次序有多少种?
为了方便起见,假设检查站可容纳任意数量的汽车。
显然,如果车队只有1辆车,可能次序1种;2辆车可能次序2种;3辆车可能次序5种。
【源代码】
【JAVA:于航】


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

/*
  如果进栈次序为:1 2 3 4 5 。。。
  出栈次序有多少种情况?
  
*/

public class A
{
    // n 个等着进栈,栈中有m个
    static int f(int n, int m)
    {
        if(n==0) return 1;
        if(m==0) return f(n-1,1);
        return f(n,m-1) + f(n-1, m+1);
    }
    
    static int f(int n)
    {
        return f(n, 0);
    }
    
    public static void main(String[] args)
    {
        for(int i=1; i<17; i++){
            System.out.println(i + ": " + f(i));
        }
    }
}

【C语言:志愿者】


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

#define _CRT_SECURE_NO_WARNINGS
#include 
#include 
/*
如果进栈次序为:1 2 3 4 5 。。。
出栈次序有多少种情况?

*/

// n 个等着进栈,栈中有m个
    int f3(int n, int m)
    {
        if (n == 0) 
            return 1;
        if (m == 0) 
            return f3(n - 1, 1);
        return 
            f3(n, m - 1) + f3(n - 1, m + 1);
    }

int f5(int n)
    {
        return f3(n, 0);
    }

void main()
    {
        for (int i = 1; i<17; i++)
        {
            printf("%d : %d \n", i, f5(i));
        }
    }



4. 第39级台阶
【问题描述】

小明刚刚看完电影《第39级台阶》。离开电影院的时候,他数了数礼堂前的台阶数,恰好是39级!
站在台阶前,他突然又想着一个问题:
如果我每一步只能迈上1个或2个台阶。先迈左脚,然后左右交替,最后一步是迈右脚,也就是说一共要走偶数步。那么,上完39级台阶,有多少种不同的上法呢?
请你利用计算机的优势,帮助小明寻找答案。

【源代码】
【JAVA:于航】


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28

public class A
{
    // 奇数步
    static long g(int n)
    {
        if(n==0) return 0;
        if(n==1) return 1;
        //if(n==2) return 1;
        
        return f(n-1) + f(n-2);
    }
    
    // 偶数步
    static long f(int n)
    {
        if(n==0) return 1;
        if(n==1) return 0;
        //if(n==2) return 1;
        
        return g(n-1) + g(n-2);
    }
    
    public static void main(String[] args)
    {
        System.out.println(f(5));
        System.out.println(f(39));
    }
}

【C语言:志愿者】


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

#define _CRT_SECURE_NO_WARNINGS
#include 
#include 
#include

long ff(int n);
    // 奇数步
long gg(int n)
{
    if (n == 0) 
        return 0;
    if (n == 1) 
        return 1;
    /*if(n==2)
        return 1;*/
    return ff(n - 1) + ff(n - 2);
}

// 偶数步
long ff(int n)
{
    if (n == 0) 
        return 1;
    if (n == 1) 
        return 0;
    /*if(n==2)
        return 1;*/
    return gg(n - 1) + gg(n - 2);
}

void main()
{
        printf("%d \n",ff(5));
        printf("%d ", ff(39));
}



5. 算式填符号
【问题描述】

匪警请拨110,即使手机欠费也可拨通!
为了保障社会秩序,保护人民群众生命财产安全,警察叔叔需要与罪犯斗智斗勇,因而需要经常性地进行体力训练和智力训练!

某批警察叔叔正在进行智力训练:
1 2 3 4 5 6 7 8 9 = 110

请看上边的算式,为了使等式成立,需要在数字间填入加号或者减号(可以不填,但不能填入其它符号)。之间没有填入符号的数字组合成一个数,例如:12+34+56+7-8+9 就是一种合格的填法;123+4+5+67-89 是另一个可能的答案。

请你利用计算机的优势,帮助警察叔叔快速找到所有答案。
每个答案占一行。形如:
12+34+56+7-8+9
123+4+5+67-89
……

【源代码】
【JAVA:于航】


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27

public class SuanShi
{
    //a: 参加计算的元素
    //k: 目前考虑的元素下标
    //so: 合成好的结果串
    //goal: 计算目标
    static void f(int[] a, int k, String so, int goal){
        if(k==0){
            if(a[0] == goal){
                System.out.println(a[0]+so);
            }
            return;
        }
        
        f(a,k-1,"+"+a[k]+so, goal-a[k]);
        f(a,k-1,"-"+a[k]+so, goal+a[k]);
        int old = a[k-1];
        a[k-1] = Integer.parseInt("" + a[k-1] + a[k]);
        f(a,k-1,so,goal);
        a[k-1] = old;
    }
    
    public static void main(String[] args){
        int[] a = {1,2,3,4,5,6,7,8,9};      
        f(a,8,"",110);
    }
}

【C语言:志愿者】


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50

#define _CRT_SECURE_NO_WARNINGS
#include 
#include 
#include

//a: 参加计算的元素
    //k: 目前考虑的元素下标
    //so: 合成好的结果串
    //goal: char
    void fk(int *a, int k, char *s, int goal){
        if (k == 0){
            if (a[0] == goal){
                printf("%d%s\n",a[0],s);
            }
            return;
        }

char * p = malloc(k * 2 + 1);
        memset(p, 0, k * 2 + 1);

p[0] = ‘+‘;
        _itoa(a[k], p+1, 10);
        int x = strlen(p);
        strcat(p+x, s);     
        fk(a, k - 1, p, goal - a[k]);

p[0] = ‘-‘;
        fk(a, k - 1, p, goal + a[k]);

int old = a[k - 1];
        char ak[1024] = { 0 };
        char ak2[1024] = { 0 };
        _itoa(a[k - 1], ak, 10);
        _itoa(a[k], ak2, 10);
        strcat(ak, ak2);
        a[k - 1] = atoi(ak);
        memset(p, 0, k * 2 + 1);
        strcat(p, s);
        fk(a, k - 1, p, goal);
        a[k - 1] = old;
    }

void main()
    {
        int a[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
        fk(a, 8, "", 110);
    }



6. 找钱问题
【问题描述】

公园票价为5角。假设每位游客只持有两种币值的货币:5角、1元。
再假设持有5角的有m人,持有1元的有n人。
由于特殊情况,开始的时候,售票员没有零钱可找。
我们想知道这m+n名游客以什么样的顺序购票则可以顺利完成购票过程。
显然,m < n的时候,无论如何都不能完成;
m>=n的时候,有些情况也不行。比如,第一个购票的乘客就持有1元。
请计算出这m+n名游客所有可能顺利完成购票的不同情况的组合数目。
注意:只关心5角和1元交替出现的次序的不同排列,持有同样币值的两名游客交换位置并不算做一种新的情况来计数。

【源代码】
【JAVA:于航】


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

//考虑最后一个人
public class ZhaoQian1
{
    //m: 持有5角的
    //n: 持有1元的
    static int f(int m, int n){
        if(m&lt;n) return 0;
        if(m==1) return 1;
        if(n==0) return 1;
            
        return f(m-1,n) + f(m,n-1);
    }
    
    public static void main(String[] args){
        System.out.println(f(2,2));
        System.out.println(f(3,2));
        System.out.println(f(5,3));
    }
}

//考虑第一个人
public class ZhaoQian2
{
    //m: 持有5角的
    //n: 持有1元的
    //t: 售票员手里有多少个5角的
    static int f(int m, int n, int t){
        if(m+t&lt;n) return 0; if(m==0) return 1; if(n==0) return 1; int r = f(m-1,n,t+1); if(t&gt;0) r += f(m,n-1,t-1); 
        return r;
    }
    
    public static void main(String[] args){
        System.out.println(f(2,2,0));
        System.out.println(f(3,2,0));
        System.out.println(f(5,3,0));
    }
}

【C语言:志愿者】


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50

#define _CRT_SECURE_NO_WARNINGS
#include 
#include 
#include 
//考虑最后一个人
//m: 持有5角的
//n: 持有1元的
int f6(int m, int n)
{
    if (m &lt; n) 
        return 0;
    if (m == 1) 
        return 1;
    if (n == 0) 
        return 1;

return f6(m - 1, n) + f6(m, n - 1);
}

void main(){
    printf("%d \n",f6(2, 2));
    printf("%d \n",f6(3, 2));
    printf("%d \n",f6(5, 3));

}

//==========================================

#define _CRT_SECURE_NO_WARNINGS
#include 
#include 
#include 
//考虑第一个人
//m: 持有5角的
//n: 持有1元的
//t: 售票员手里有多少个5角的
int fn(int m, int n, int t)
{
    if (m + t&lt;n) return 0; if (m == 0) return 1; if (n == 0) return 1; int r = fn(m - 1, n, t + 1); if (t&gt;0) 
        r += fn(m, n - 1, t - 1);
    return r;
}

void main()
{
    printf("%d \n", fn(2, 2, 0));
    printf("%d \n", fn(3, 2, 0));
    printf("%d \n", fn(5, 3, 0));

}



7. 振兴中华
【问题描述】
小明参加了学校的趣味运动会,其中的一个项目是:跳格子。
地上画着一些格子,每个格子里写一个字,如下所示:(也可参见下图)

从我做起振
我做起振兴
做起振兴中
起振兴中华

比赛时,先站在左上角的写着“从”字的格子里,可以横向或纵向跳到相邻的格子里,但不能跳到对角的格子或其它位置。一直要跳到“华”字结束。

要求跳过的路线刚好构成“从我做起振兴中华”这句话。
请你帮助小明算一算他一共有多少种可能的跳跃路线呢?

【源代码】
【JAVA:于航】


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

public class A
{
    static int f(int m, int n)
    {
        if(m==1 || n==1) return 1;
        
        return f(m-1,n) + f(m,n-1);
    }
    
    public static void main(String[] args)
    {
        System.out.println(f(5,4));
        //System.out.println(f(3,2));
    }

}

【C语言:志愿者】


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

#define _CRT_SECURE_NO_WARNINGS
#include 
#include 
#include 
int f7(int m, int n)
{
    if (m == 1 || n == 1) 
        return 1;
    return f7(m - 1, n) + f7(m, n - 1);
}

void main7()
{
    printf("%d \n", f7(5, 4));
    //printf("%d \n", f7(3, 2));
}

原文地址:https://www.cnblogs.com/passion-sky/p/8545345.html

时间: 2024-10-01 04:16:32

于航特训课第二课的相关文章

2016.06.05 周日 实训课第二课 “中断”讲解

课程内容: 外部中断   引用------- 单片机教程网例子    ←链接 单片机在自主运行的时候一般是在执行一个死循环程序,在没有外界干扰(输入信号)的时候它基本处于一个封闭状态.比如一个电子时钟,它会按时.分.秒的规律来自主运行并通过输出设备(如液晶显示屏)把时间显示出来.在不需要对它进行调校的时候它不需要外部干预,自主封闭地运行.如果这个时钟足够准确而又不掉电的话,它可能一直处于这种封闭运行状态.但事情往往不会如此简单,在时钟刚刚上电.或时钟需要重新校准.甚至时钟被带到了不同的时区的时候

我的“便(bian)宜&quot;Python网课第二课

二.变量.字符编码 Variables are used to store infomation to be referenced and manpulated in a computer program. They also provide a way of labeling data with a descriptive name, so our program can be understood more clearly by the reader and ourselves. It is

于航特训课:第一课

[主办单位] 蓝桥杯全国软件和信息技术专业人才大赛组委会 [课程时间] 3月4号-3月31号 [特训内容] 7次算法课,大赛特邀专家精讲历届真题及高频算法 直至赛前,资深算法老师群内作业辅导和答疑 全国参赛小伙伴互助带打 第2次课<递归原理与构造技巧>开课时间:2018年3月7日晚上7:30 [课程简介] <2018蓝桥杯大赛算法特训>是应广大考生需求,由蓝桥杯全国软件和信息技术专业人才大赛组委会主办,聘请大赛资深顾问专家团成员之一于航老师,通过"图文+音视频"

第二课:IOS(App)UIImage控件与TextField控件学习

作为一名实习生我是1.3.5在办公室工作,2.4.6去另一个地方听课学习IOS(app)课程,为了不落下课程,我准备每天晚上把落下的课程自学一遍,把不懂的记下等去听课的时候问老师,希望自己能跟上学习的步伐,不浪费时间.这一课是前几天听的,今天一起也写上了. 第二课:IOS(App)UIImage控件与TextField控件的学习,代码如下 一:UIImage控件代码:把图片添加到视图中并设置大小,这里没有牵涉到图片背景的颜色设置,我猜想应该是没必要去设置的吧,因为没有按钮功能的话背景颜色也看不到

grails2.3.11第二课

第二课主要介绍grails相关插件的使用,这是敏捷开发所必需的途径. 可以把grails的插件看作是grails正常项目的迷你型,因为看插件的源码,它的目录结构和正常项目相差无几. 官方开源插件地址 https://grails.org/plugins 内部插件地址 http://maven.info.bit.edu.cn 主要介绍了常用的一些插件吧,每个插件的用法不尽相同,但是有一个共同点是要在BuildConfig.groovy这个配置文件里 compile 相关插件. 常用的包括: 前端插

【C语言探索之旅】 第三部分第二课:SDL开发游戏之创建窗口和画布

内容简介 1.第三部分第二课: SDL开发游戏之创建窗口和画布 2.第三部分第三课预告: SDL开发游戏之显示图像 第三部分第二课:SDL开发游戏之创建窗口和画布 在上一课中,我们对SDL这个开源库做了介绍,也带大家配置了SDL的开发环境.请大家按照上一课的步骤创建一个SDL工程,能够初步运行. 如果遇到问题,可以百度,Google相关平台SDL的配置.或者联系小编. 当然了,有些朋友可能会说开发C语言游戏还可以用GTK+这个库,但是个人认为GTK+没有SDL那么适合开发游戏,其创建图形界面的能

【Cocos游戏实战】功夫小子第二课之基础类分析和实现

本节课的视频教程地址是:第二课在此 如果本教程有帮助带您,希望您能点击进去观看一下,而且现在注册成为极客学院的会员,验证手机号码和邮箱号码会赠送三天的会员时间,会员可以无限制的下载和观看所有的视频,谢谢您的支持! 在开始第二节课之前,这里需要声明的是, 首先:本系列课程是为了结合Cocos2d-x 3.x 的基本组件和核心模块的学习而制作的,开发所使用的版本是3.0,但是代码稍加修改就可以运用在3.X的其他版本上. 其次:本游戏项目是一个非商业化项目,游戏资源和代码都会在后续的课程中释放出来,供

【转】第二课.配置和初始化

原文网址:http://fsjoy.blog.51cto.com/318484/244803 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://fsjoy.blog.51cto.com/318484/244803 第二课.配置和初始化 配置git 在使用git之前你需要配置一下git.git在你创建提交的时候会记录你的名字和email地址,所以你应该告诉git这些内容.可以使用'git config'命令来设置,如果传递参数'-

ThinkPHP第二课 框架MVC目录和URL访问方式

第二课 框架MVC目录和URL访问方式 1.说明: ThinkPHP是基于MVC的框架,认识框架目录将更好的实现分层,掌握ThinkPHP.URL访问就是访问框架的控制器(MVC中的C),共有四种方式,框架中的C起到分模块的作用. url的4种访问方式: 1.PATHINFO 模式 -- 重点!!!!!! http://域名/项目名/入口文件/模块名/方法名/键1/值1/键2/值2 2.普通模式 http://域名/项目名/入口文件?m=模块名&a=方法名&键1=值1&键2=值2