青蛙過河 猴子爬山 兔子繁殖 開寶箱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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章