歷屆試題 出棧次序

2022-02-23 04:03:38 字數 1870 閱讀 1186

x星球特別講究秩序,所有道路都是單行線。乙個甲殼蟲車隊,共16輛車,按照編號先後發車,夾在其它車流中,緩緩前行。

路邊有個死胡同,只能容一輛車通過,是臨時的檢查站,如圖【p1.png】所示。

x星球太死板,要求每輛路過的車必須進入檢查站,也可能不檢查就放行,也可能仔細檢查。

如果車輛進入檢查站和離開的次序可以任意交錯。那麼,該車隊再次上路後,可能的次序有多少種?

為了方便起見,假設檢查站可容納任意數量的汽車。

顯然,如果車隊只有1輛車,可能次序1種;2輛車可能次序2種;3輛車可能次序5種。 現在足足有16輛車啊,親!需要你計算出可能次序的數目。

思路:這道題其實是乙個進棧出棧的題,也就是問所有出棧順序的可能數,如果之前了解過這方面的問題的同學,這道題其實就是送分題,可以直接利用卡特蘭數的公式求解,不了解的話

可以看一下我之前寫的一篇部落格,也是關於進出棧次序的問題,有對卡特蘭數詳細的分析,下面是幾種網上的常見求解思路,做了一下總結

方法一:求出棧次序,無非就是問一共有多少種滿足要求的排列,滿足條件在本題中就是指,只有站中有「車」,才能夠出來。假設1,代表進站,0代表出站,r代表進棧的個數,l代表出棧的個數,易知

只有進棧的個數r大於等於出棧的個數l才可以出棧或進棧,否則只能進棧,因此可以進行回溯求出所有可能的方案。

1 #include2

3using

namespace

std;45

int num=0;6

789void dfs(int n,int r,int

l)18

1920

21if(r>l)else

4041

4243

return;44

45}4647

4849

intmain()

方法二:利用卡特蘭數的公式f(n) = f(0)*f(n-1) + f(1)*f(n-2) + ... +f(n-1)*f(0)

1 #include 2

3int

main()45

3233 printf("

%d",f[16

]);34

35return0;

3637 }

方法三:卡特蘭數的另一種遞推公式h(n)=h(n-1)*(4*n-2)/(n+1)

1 #include 2

3int

main()45

方法四:卡特蘭數遞推公式的解:h(n)=c(n,2n)*(2n-1) (n=0,1,2,...)

該種方法有一定的侷限性,因為n>14時資料會超出unsigned long long int 的範圍(0~2^64-1),不過可以考慮先求n=14的解,再用計算器推出n=16的解。

1 #include2

3using

namespace

std;

4int

m;5 unsigned long

long

int f(intn)6

12for(int i=2*n;i>n;i--)

15 // cout << m2 << "--"

<< m1 <

16 m=m2/m1;

17return

m;18}19

intmain()

2027

return0;

28 }

總之熟記卡特蘭數即可。

藍橋杯 出棧次序

題目描述 x星球特別講究秩序,所有道路都是單行線。乙個甲殼蟲車隊,共16輛車,按照編號先後發車,夾在其它車流中,緩緩前行。路邊有個死胡同,只能容一輛車通過,是臨時的檢查站,如圖 p1.png 所示。x星球太死板,要求每輛路過的車必須進入檢查站,也可能不檢查就放行,也可能仔細檢查。如果車輛進入檢查站和...

藍橋杯 出棧次序 Python

題目 x星球特別講究秩序,所有道路都是單行線。乙個甲殼蟲車隊,共16輛車,按照編號先後發車,夾在其它車流中,緩緩前行。路邊有個死胡同,只能容一輛車通過,是臨時的檢查站,如圖 p1.png 所示。x星球太死板,要求每輛路過的車必須進入檢查站,也可能不檢查就放行,也可能仔細檢查。如果車輛進入檢查站和離開...

資料結構學習 棧的出棧次序及次序種類

學過資料結構的程式猿應該都清楚,棧是一種先入後出,後入先出 lifo 的表。即插入和刪除都只能在乙個位置上進行,即棧頂位置。對棧的基本操作有push 入棧 和pop 出棧 在一般軟體研發的筆試中,就會經常遇到關於入棧次序一定時,出棧次序有哪些?共有幾種?其實,此處只要了解一下卡特蘭數的演算法結構,參...