卡特蘭數 火車進站問題的C語言解決方法

2021-10-08 14:09:02 字數 2148 閱讀 4480

模擬火車的行為有些困難。

所以嘗試找到所有可能的排列情況,然後判斷其中可能的情況。

首先是生成全排列的函式

/* 生成全排列 返回個數*/

char all_str[1000][100];

void swap(char*str, int src, int dst)

int cnt_sort = 0;

void sort(int loc, char* str, int level)

sort(loc, str, level + 1);

for(i = 0; i+level < loc; i++)

for(i = loc - level - 1; i>= 0;i--)

swap(str, level+i, level - 1);

}int all_sort(int n, char str[100])

生成的所有排列情況儲存在all_str中

然後是判斷函式

int testisseq(int n, stack *stk, char str1[100], char str2[100])

else if(stk->top>=0 && stk->stack[stk->top] == str2[y])

else if(x < n)

else

}printf("%s\n",flag?"yes":"no");

return flag;

}

比較複雜,但是可行

全部**如下

#include

#include

#include

typedef

struct

stack;

/* 判斷str2是否是一種出站順序 */

inttestisseq

(int n, stack *stk,

char str1[

100]

,char str2[

100]);

/* 生成全排列 返回個數*/

char all_str[

100]

[100];

void

swap

(char

*hash,

int src,

int dst)

int cnt_sort =0;

void

sort

(int loc,

char

* str,

int level)

sort

(loc, str, level +1)

;for

(i =

0; i+level < loc; i++

)for

(i = loc - level -

1; i>=

0;i--

)swap

(str, level+i, level -1)

;}intall_sort

(int n,

char str[

100]);

intmain

(int argc,

const

char

** ar**)

printf

("一共有%d種\n"

,cnt)

;scanf

("%d");

}int

testisseq

(int n, stack *stk,

char str1[

100]

,char str2[

100]

)else

if(stk->top>=

0&& stk->stack[stk->top]

== str2[y]

)else

if(x < n)

else

}printf

("%s\n"

,flag?

"yes"

:"no");

return flag;

}int

all_sort

(int n,

char str[

100]

)

火車進出棧問題 卡特蘭數

更新提示 第一次更新 正文 一列火車n節車廂,依次編號為1,2,3,n。每節車廂有兩種運動方式,進棧與出棧,問n節車廂出棧的可能排列方式有多少種。乙個數,n n 65000 乙個數s表示n節車廂出棧的可能排列方式 35轉換一下題意 求卡特蘭數的第 n 項,不取模。先考慮 n 小一點的做法,我們可以直...

棧 卡特蘭數 火車進出棧問題

傳送門 題意 一列火車n節車廂,依次編號為1,2,3,n。每節車廂有兩種運動方式,進棧與出棧,問n節車廂出棧的可能排列方式有多少種。資料範圍 1 n 60000 輸入樣例 3輸出樣例 5思路 進出棧問題 序列問題 路徑問題。這顯然是上一道火車進棧的公升級版,資料太大不能再進行遞迴處理了。問題轉換 尋...

卡特蘭數的推導證明以及在排列問題上的相關應用

一 前提 構建乙個 s,x 序列,其中用 s 表示入棧,用 x 表示出棧,s和x個數相同為n。顯然,在每個合理序列的任意字首子串行中,s 入棧 的個數總是大於等於x 出棧 的個數。易得,對於乙個有n個s和n個x的2n序列,它的總序列數為 c 2n,n 包括合理序列和不合理序列。那麼所要求的 合理序列...