本節課主要的內容:
典型問題的遞迴框架
(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個整數,表示最後感冒螞蟻的數目。
樣例輸入
35 -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 ...