給定乙個入棧順序,輸出所有出棧順序及其方法數。對於乙個一入棧的的數,他有兩種選擇,出棧進而輸出,或者不出棧,等待新的元素進棧,不論哪一種操作,操作完成之後都會形成乙個新的序列,這跟進行出棧,入棧操作之前一樣,因此可以用遞迴的方法來模擬實現。輸入的引數有3個,輸入佇列,中間用來儲存的棧,用於輸出的佇列。我們在進行某一種操作後,這三種資料結構中的數會發生變化,但我們可以把它看做是初始的一種狀態,從而進行遞迴。
遞迴的終止條件是:輸入隊列為空,並且中間棧也為空,此時所有資料都儲存在輸出佇列中,可以輸出佇列,並且在終止條件中可以統計所有可能的方法數,num++;此時這種情況已經結束,可以返回到呼叫他的最初函式處,再考慮另一種操作(相等於另一條路徑,但是要儲存好之前的狀態),再進行遞迴。
/*
已知入棧順序,但可以在任意時刻出棧,求所有出棧順序
輸入佇列 q1 中間棧st 輸出佇列q2
if(輸入隊列為空)
void clear_qu(queue
&s)void printqueue(queue
q)cout
<< endl;
}void dfs(queue
&in,stack
&st, queue
&out)
else
//棧不為空
}else
//輸入不為空
else
//棧不為空}}
執行結果如下,實際上對於乙個輸入數量為n的序列(n<=10),共有c(2n,n)/(n+1)中情況,稱之為卡特蘭數。
DFS求解DecodeWays輸出所有情況和方法數
這是一道leetcode上的原題,在筆試面試中也經常遇到。一般我們只要求出所有的解碼種類數目就可,並沒有要求輸出所有的解碼序列,這裡運用dfs解決了這個問題。題目描述如下 現在我們先求解一下編碼方法數。通過題目我們可以知道,編碼是通過乙個或兩個字元來實現,對於乙個編碼 12125 可以乙個乙個字元的...
Shooting Game棧的輸出順序
可能有多個測試輸入,第一行給出總共的測試輸入的個數t,和每個測試輸入的子彈數n。0 t 20,0 n 10 每個測試輸入只有一行 用空格隔開的n個數,表示子彈打出的編號順序。輸出yes或者no表示判斷結果 例如 input 2 4 4 3 2 1 4 2 3 1 output yes no hint...
迷宮求解演算法(棧DFS以及佇列BFS)
我們首先給出乙個迷宮,它的規格是5 5,在這裡我使用int的二維陣列表示迷宮,其中1表示障礙,0表示可以通行的道路,要求從 0,0 座標走到 4,4 座標,並輸出走過的座標路徑。int maze 5 5 使用棧來實現dfs 深度優先搜尋 首先,我們給出棧在迷宮中的的結構定義。x是迷宮中的橫座標 y是...