青蛙过河 猴子爬山 兔子繁殖 开宝箱2 找气球 指针函数 铺地砖

Problem A: 青蛙过河

Description

一条小溪尺寸不大,青蛙可以从左岸跳到右岸,在左岸有一石柱L,面积只容得下一只青蛙落脚,同样右岸也有一石柱R,面积也只容得下一只青蛙落脚。有一队青蛙从尺寸上一个比一个小。我们将青蛙从小到大,用1,2,…,n编号。规定初始时这队青蛙只能趴在左岸的石头L上,当然是一个落一个,小的落在大的上面。不允许大的在小的上面。在小溪中有S个石柱,有y片荷叶,规定溪中的柱子上允许一只青蛙落脚,如有多只同样要求一个落一个,大的在下,小的在上。对于荷叶只允许一只青蛙落脚,不允许多只在其上。对于右岸的石柱R,与左岸的石柱L一样允许多个青蛙落脚,但须一个落一个,小的在上,大的在下。当青蛙从左岸的L上跳走后就不允许再跳回来;同样,从左岸L上跳至右岸R,或从溪中荷叶或溪中石柱跳至右岸R 上的青蛙也不允许再离开。问在已知溪中有S根石柱和y片荷叶的情况下,最多能跳过多少只青蛙?

Input

多组测试数据,先输入一个整数T,表示组数,然后输入然后输入t行,每行输入2个整数s和y

Output

对于每组测试数据,请输出最多能跳过的青蛙数

Sample Input

3
0 1
0 2
1 1

Sample Output

2
3
4
可以看一下这个

代码实现

#include<bits/stdc++.h>
using namespace std;
int count(int s,int y)
{
    if(s==0)    return y+1;
    else    return 2*count(s-1,y);
}
int main()
{
    int t,s,y;
    while(cin>>t)
        while(t--)
        {
            cin>>s>>y;
            cout<<count(s,y)<<endl;
        }
    return 0;
}

Problem B: 深入浅出学算法017-猴子爬山

Description

一个猴子在一座不超过30级的小山上爬山跳跃,猴子上山一步可跳1级或跳3级,试求上山有多少种不同的爬法

Input

多组测试数据,每组输入1个整数n,表示山的台阶数

Output

对于输入的整数n求出多少种爬法

Sample Input

30

Sample Output

58425

思路

猴子可以是从上一格上来的
也可能是迈三步上来的

代码

#include<iostream>
using namespace std;
int main()
{
    int n,f[40]={1,1,1,2};
    while(cin>>n)
    {
        for(int i=4;i<=n;i++)
            f[i]=f[i-1]+f[i-3];
        cout<<f[n]<<endl;
    }
    return 0;
}

Problem C: 深入浅出学算法018-兔子繁殖

就上面改成 f[i]=f[i-1]+f[i-2] 就行

Problem D: 开宝箱2

Description

急先锋是一个商人,有一天找到了一个宝箱,宝箱需要正确的密码才能打开。同时他发现宝箱上有一个数字,和一份密码表。密码表上有n个密码,只有一个密码是正确的。

急先锋所在的岛上有m个地点,每个地点有两个神秘的数字。他通过交易得到每个地点上拥有的信息,也知道这个宝箱上的数字是一个地点的标号x。急先锋需要先到x号地点,x号地点上的第一个数字就是他要去的最终地点的标号,最终的地点上的第二个数字就是密码在密码表上的序号。

由于宝箱中的宝物价值太大。每过一段时间,有些地点上的数字将会发生变化。

急先锋想要知道打开这个宝箱的密码,聪明的你能不能直接告诉他呢?

Input

第一行两个数字n,m.(1<=n,m<=20)

接下来n个数字ai表示密码表上序号1到序号n的密码分别是多少。(1 <=ai<=100)

接下来m行每行两个数字u,v。(1 <= u<=m,1<= v <=n)

然后给你一个T,表示T次操作。(1<=T<= 20)

接下来的T行,每行的第一个数字op,表示第op种操作。

第1种操作:接下来有一个数字x,表示宝箱上的数字。(1<=x<=m)。

第2种操作:接下来有三个数字x,u,v,表示x号地点的数字改成u,v。

Output

每次执行第一种操作1后,输出一个数字表示最后的密码。(每个数字占1行)。

Sample Input

5 4
1 2 3 4 5
2 4
3 3
1 2
2 5
4
1 1
2 1 4 2
1 1
1 2

Sample Output

3
5
2

思路

题目不难
就是数据多 有点复杂 拿出笔写一写就不难
在这里插入图片描述

#include<iostream>
using namespace std;
int main()
{
    int n,m,a[30],dd[30][2],t,op,x,u,v,i;
    while(cin>>n>>m)
    {
        for(i=1;i<=n;i++)
            cin>>a[i];
        for(i=1;i<=m;i++)
            cin>>dd[i][0]>>dd[i][1];
        cin>>t;
        while(t--)
        {
            cin>>op;
            if(op==1)
            {
                cin>>x;
                cout<<a[dd[dd[x][0]][1]]<<endl; //这一句画个图就懂了
            }
            else if(op==2)
            {
                cin>>x>>u>>v;
                dd[x][0]=u;
                dd[x][1]=v;
            }
        }
    }
    return 0;
}

Problem E: 找气球

Description

zstu集训队经常举办月赛,但是气球经常不够.现有多个桶,每个桶有一种颜色,每个桶可能对应多个题,给定每个题对应的桶,打比赛的时候,经常某道题被发现是水题,但是该颜色的气球没有了,所以quxing201606只能用另一种颜色的气球代替,即把某个桶颜色改成另一种颜色.quxing201606还想知道某道题是什么颜色(属于的桶的颜色).(必须使用指针数组完成!!!)

Input

多组测试,两个数n,m,(n<=100)表示n个题,(m<=100)表示m个桶.接下来m个数,第i个数表示第i个桶对应的颜色.然后n个数,表示第i题属于哪个桶.接下来一个q(<=100),表示q个操作,然后q行,每行第一个op,表示是什么操作.op为1时,两个数x,y,表示把x个桶的颜色变化为y.op为2时,一个数x,表示查询第x题的气球颜色

Output

对于每个op为2的操作输出一个数,表示该题对应的气球是什么颜色

Sample Input

3 2
3 4
1 1 2
3
2 1
1 1 2
2 2

Sample Output

3
2

跟上题相似 不赘述

#include<iostream>
using namespace std;
int main()
{
    int n,m,tong[110],ti[110],q,op,x,y,i;
    while(cin>>n>>m)
    {
        for(i=1;i<=m;i++)
            cin>>tong[i];
        for(i=1;i<=n;i++)
            cin>>ti[i];
        cin>>q;
        while(q--)
        {
            cin>>op;
            if(op==2)
            {
                cin>>x;
                cout<<tong[ti[x]]<<endl;
            }
            else if(op==1)
            {
                cin>>x>>y;
                tong[x]=y;
            }
        }
    }
    return 0;
}

Problem F: 指针函数

函数指针基本知识

函数指针 顾名思义 就是指向函数的指针
每个函数都占用一段内存单元,它们有一个入口地址(起始地址)
在C语言中,函数名代表函数的入口地址。
我们可以定义一个指针变量,接收函数的入口地址,让它指向函数,这就是指向函数的指针,也称为函数指针。
通过函数指针可以调用函数,它也可以作为函数的参数。

在这里插入图片描述
这里的int都改成void也是没有问题的 毕竟因为他没有返回值嘛
这样就实现了用函数指针调用函数的功能
然后你再看看题目的提示:写两个函数 算面积 然后再写一个 用上面两个做参数算面积 这样应该能理解了

Description

YHZ自认为很聪明的人, 在C语言课上老师布置了一个作业,让能求正方形和圆的面积, 正当YHZ要跃跃欲试的时候, 老师却要求使用函数指针来实现这个功能,YHZ立马就不会了,他现在向你求助,你能帮他完成这个程序吗?

提示:

编写calAreaSquare(double x)函数来计算边长为x的正方形面积。

编写calAreaCircle(double x)函数来计算半径为x的圆面积。

编写calArea函数用以上两个函数作为参数实现求正方形和圆的面积。

Pi的求法

#include<math.h>

Pi= acos(-1.0)

Input

第一行有一个正数T表示有T个询问。 接下来有T行,每行有一个正数op, 和一个浮点数x,

如果op = 1, x 表示正方形的边长。 如果 op = 2, x 表示圆的半径。

Output

输出只有一行表示所求的面积(保留五位小数)。

Sample Input

2
1 2
2 1

Sample Output

4.00000
3.14159

代码实现

其实我觉得这个题目要实现这个功能也是自找麻烦

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
double Pi = acos(-1.0);
double calAreaSquare(double x)
{return x*x;}
double calAreaCircle(double x)
{return Pi*x*x;}
double calArea(double x,int *op)
{
    double (*square)(double);
    double (*circle)(double);
    square=calAreaSquare;
    circle=calAreaCircle;
    if(*op==1)
        printf("%.5f\n",(*square)(x));
    else if(*op==2)
        printf("%.5f\n",(*circle)(x));
}
int main()
{
    int t,op;
    double x;
    while(cin>>t)
    {
        while(t--)
        {
            cin>>op>>x;
            if(op==1)
                calArea(x,&op);
            else if(op==2)
                calArea(x,&op);
        }
    }
    return 0;
}

Problem G: 铺地砖

Description

元旦过去了,新年大酬宾活动也已经告一段落了。陈盖历望着堆在仓库的瓷砖,很无聊的他把这些瓷砖裁成很多1X1 1X2 1X3的小瓷砖,然后他把这些小瓷砖排在地上画的一个1*n的长方形里。问铺满这个长方形共有多少种方法?

Input

首先输入一个整数T,表示有T组测试数据 然后是T行,每行输入1个正整数n(n<=50)

Output

对于每个n输出铺的方法种数

Sample Input

3
1
2
3

Sample Output

1
2
4
还有一道一模一样的题:骨牌铺法

代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int a[100],i,t,n;
    while(cin>>t)
    {
        while(t--)
        {
            cin>>n;
            a[1]=1;a[2]=2;a[3]=4;
            for(i=4;i<=n;i++)
                a[i]=a[i-1]+a[i-2]+a[i-3];
            cout<<a[n]<<endl;
        }
    }
    return 0;
}

发布了149 篇原创文章 · 获赞 14 · 访问量 8996

猜你喜欢

转载自blog.csdn.net/weixin_45485719/article/details/103482872