藍橋杯演算法特訓 典型問題的遞迴框架 未完待續

2021-08-17 03:59:45 字數 3305 閱讀 9968

本節課主要的內容:

典型問題的遞迴框架

(1)    排列問題

(2)    組合計數問題

(3)    組合列舉問題

(4)    遞迴設計-條條大路通羅馬 

引入:——————1————————1————————1————————————1————————————1

有一根27厘公尺的細木桿,在第3厘公尺、7厘公尺、11厘公尺、17厘公尺、23厘公尺這五個位置上各有乙隻螞蟻。

* 木桿很細,不能同時通過乙隻螞蟻。開始 時,螞蟻的頭朝左還是朝右是任意的,它們只會朝前走或調頭,

* 但不會後退。當任意兩隻螞蟻碰頭時,兩隻螞蟻會同時調頭朝反方向走。假設螞蟻們每秒鐘可以走一厘公尺的距離。

* 編寫程式,求所有螞蟻都離開木桿 的最小時間和最大時間。

思路:首先,講一下思路:螞蟻碰頭後掉頭,可以當作螞蟻可以直接」穿過「對方,即螞蟻碰頭對螞蟻運動沒有影響。然後可以轉換為每乙隻螞蟻從初始位置直接到離開木桿的場景。

題1:螞蟻感冒

長100厘公尺的細長直桿子上有n只螞蟻。它們的頭有的朝左,有的朝右。 每只螞蟻都只能沿著桿子向前爬,速度是1厘公尺/秒。 當兩隻螞蟻碰面時,它們會同時掉頭往相反的方向爬行。 這些螞蟻中,有1只螞蟻感冒了。並且在和其它螞蟻碰面時,會把感冒傳染給碰到的螞蟻。 請你計算,當所有螞蟻都爬離桿子時,有多少只螞蟻患上了感冒。輸入

第一行輸入乙個整數n (1 < n < 50), 表示螞蟻的總數。

接著的一行是n個用空格分開的整數 xi (-100 < xi < 100), xi的絕對值,表示螞蟻離開桿子左邊端點的距離。正值表示頭朝右,負值表示頭朝左,資料中不會出現0值,也不會出現兩隻螞蟻占用同一位置。其中,第乙個資料代表的螞蟻感冒了。

輸出要求輸出1個整數,表示最後感冒螞蟻的數目。

樣例輸入

3

5 -2 8

5-10 8 -20 12 25

樣例輸出

遞迴的真正難點在於:相似性的設計,在於如何設計引數才能相似

3.2排列問題 = 排列計數 + 排列列舉

關鍵點:不重複不遺漏

題2:已知不同字母構成的串,求它的全排列

第一種解法:直觀遞迴

第二種:陣列

#includeusing namespace std;

void swap(char* a,char* b)

void permute(char *a, int low, int high) }}

int main()

#include#include#includeusing namespace std;

int main()

int main()

; for (char i = 'a'; i <= 'e'; i++)

} }

return 0;

}

實際應用題5:

x星球要派出乙個5人組成的觀察團前往w星。

其中:a國最多可以派出4人。

b國最多可以派出2人。

c國最多可以派出2人。

d國最多可以派出1人。

e國最多可以派出1人。

f國最多可以派出3人。

那麼最終派往w星的觀察團會有多少種國別的不同組合呢?

#includeusing namespace std;

#define n 6

#define m 5

#define buf 1024

//a:可取最大個數的限定

//k: 當前考慮位置

//m: 目標名額

//b: 已經決定的代表團成員

void f(int a,int k,int m,char b)

}int main()

; for (int i = 0; i < 8; i++)

{ para[0] = card[i];

for (int i2 = 0; i2 < 8; i2++)

{ if (i2 == i)continue;

para[1] = card[i2];

for (int i3 = 0; i3 < 8; i3++)

{if (i3 == i || i3 == i2)continue;

para[2] = card[i3];

for (int i4 = 0; i4 < 8; i4++)

{if (i4 == i || i4 == i2 || i4 == i3)continue;

para[3] = card[i4];

for (int i5 = 0; i5 < 8; i5++)

{if (i5 == i || i5 == i2 || i5 == i3 || i5 == i4)continue;

para[4] = card[i5];

for (int i6 = 0; i6 < 8; i6++)

{if (i6 == i || i6 == i2 || i6 == i3 || i6 == i4 || i6 == i5)continue;

para[5] = card[i6];

for (int i7 = 0; i7 < 8; i7++)

{if (i7 == i || i7 == i2 || i7 == i3 || i7 == i4 || i7 == i5 || i7 == i6)continue;

para[6] = card[i7];

for (int i8 = 0; i8 < 8; i8++)

{if (i8 == i || i8 == i2 || i8 == i3 || i8 == i4 || i8 == i5 || i8 == i6 || i8 == i7)continue;

para[7] = card[i8];

int in1 = findit('a', 0);

int in2 = findit('a', in1 + 1);

int in3 = findit('2', 0);

int in4 = findit('2', in3 + 1);

int in5 = findit('3', 0);

int in6 = findit('3', in5 + 1);

int in7 = findit('4', 0);

int in8 = findit('4', in7 + 1);

//cout<

藍橋杯 問題 1004 遞迴 母牛的故事

問題 1004 遞迴 母牛的故事 時間限制 1sec 記憶體限制 128mb 提交 38150 解決 11352 題目描述 有一頭母牛,它每年年初生一頭小母牛。每頭小母牛從第四個年頭開始,每年年初也生一頭小母牛。請程式設計實現在第n年的時候,共有多少頭母牛?輸入輸入資料由多個測試例項組成,每個測試例...

藍橋杯 演算法訓練 2的次冪表示(遞迴演算法)

問題描述 任何乙個正整數都可以用2進製表示,例如 137的2進製表示為10001001。將這種2進製表示寫成2的次冪的和的形式,令次冪高的排在前面,可得到如下表示式 137 2 7 2 3 2 0 現在約定冪次用括號來表示,即a b表示為a b 此時,137可表示為 2 7 2 3 2 0 進一步 ...

藍橋杯 演算法訓練 2的次冪表示(遞迴)

這個遞迴挺難得,湊合看懂 任何乙個正整數都可以用2進製表示,例如 137的2進製表示為10001001。將這種2進製表示寫成2的次冪的和的形式,令次冪高的排在前面,可得到如下表示式 137 2 7 2 3 2 0。現在約定冪次用括號來表示,即a b表示為a b 此時,137可表示為 2 7 2 3 ...