模擬火車的行為有些困難。
所以嘗試找到所有可能的排列情況,然後判斷其中可能的情況。
首先是生成全排列的函式
/* 生成全排列 返回個數*/
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 包括合理序列和不合理序列。那麼所要求的 合理序列...