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;
}