POJ 1780 Code 尤拉迴路 模擬棧

2021-06-22 10:24:32 字數 2161 閱讀 3463

poj 1780 code(尤拉迴路+模擬棧)

題意:(題意較複雜)大致思想是給你乙個n,表示乙個由0-9數字構成的n位密碼.這個解鎖過程如下:鎖一直讀入所有內容.只要當它最後讀入的n個數字與密碼吻合,那麼就表示解鎖了.現在要你輸出乙個長度為10^n+n-1的數字序列,這個數字序列包括了n位密碼的所有可能.(也就是說輸入這個序列,必定解鎖)

分析:首先題目中說了對於n位密碼,鎖中存了乙個n-1位的當前狀態.

可以證明:所有10^(n-1)個狀態(一共這麼多個

,可以自己算算)中,任意乙個狀態都有一條出邊(由0-9構成)和一條入邊(由0-9構成),且出邊數==入邊數(

這個可以自己假定

n=1,n=2

驗證一下

,注意這裡可能存在

0000

這種自環

). 所有這個鎖的狀態圖是乙個尤拉圖,可以找到乙個尤拉迴路,正好可以將該尤拉圖的所有邊走僅一次.(走過所有邊一次等同於遍歷了所有可能的

n位密碼一次

,想想是不是)

所以對於這道題,我們只需要輸出其狀態圖的尤拉迴路即可.不過既然要輸出尤拉迴路,就要遍歷所有的可行邊.但是這個圖中的邊是無數的重複0-9的數字,我們如何標記每一條邊呢?

假設n=4,我們用4321(四千三百二十一)表示一條從432狀態經過數字1出去的邊.這種表示方式我們可以保證可以不重複的標記該狀態圖中的所有邊.

注意(假設n=4)0000一定是乙個可能的密碼,所以我們把最終結果速度ans的0-3位設為0,且標記vis[0]為true(表示從狀態000經0邊出去的,這是乙個自環.從000經過0邊依然是到000狀態.注意

:我們標記的是每一條邊

,不是每個狀態節點).

剩下的就是模擬棧來列印尤拉路徑的事了.這有點麻煩.注意這裡我們模擬的過程如下:首先初始狀態是狀態0,下面

從狀態0走

00到狀態0,(00)

從狀態0走

01到狀態1,(001)

從狀態1走

10到狀態0,(0010)

從狀態0走

02到狀態2,(00102)

從狀態2走

00到狀態0,(001020)

從狀態0走

03到狀態3,(0010203) …

當前我們的ans陣列已經為(

0010203040506070809) 了,我們當前狀態是9,且90這條邊我們沒走過,所以我們將走90邊:

從狀態9走

90到狀態0,( 00102030405060708090)

此時我們發現我們現在在狀態0,但是0節點的所有出邊我們已經走過了一遍(也就是說我們進到0狀態就出不去了),這樣我們輸出不了尤拉迴路了,說明我在狀態9的時候不應該先走邊90,而應該去走邊91,92…等,然後我們通過某條邊x9回到了狀態9之後,最後走邊90結束尤拉迴路的過程.(因為起點是狀態0,終結點也是狀態0)

所以對於我們已經從9走了邊90到了死胡同0狀態,我們應該回退該過程,即標記90邊未走過,且把當前狀態重新設為9,且我們選擇邊的起點應該從91(即0的下乙個位置)開始選.

上面這個過程是用陣列棧模擬深度優先遍歷的過程,而不是模擬euler函式的過程.(但是我們如何證明深度優先遍歷就一定能輸出尤拉迴路呢

?這個問題我還不知道

,其實就是

euler

遞迴函式如何非遞迴實現的問題)

ac**:

#include#includeusing namespace std;

const int maxn=1000000+10;

char ans[maxn];//儲存最終的結果

bool vis[maxn];//標記邊是否被走過

int main()

int mod=1,end=1;

for(int i=1;i<=n;i++)

mod /=10;

end+=n-1;

for(int i=0;i489ms

}return 0;

}

POJ 1780 Code 尤拉路徑

題意 破解一套1 6位長度密碼的系統,尋找這樣乙個序列 對於n位的密碼10 n n 1長度的連續的長為n的串能夠列舉完所有的密碼。解法 構圖之後直接dfs會超記憶體,因此需要使用棧來實現。調了很久。如下 include include include include include using na...

poj1386 尤拉迴路)

題目鏈結 解題思路 把每個單詞當成是一條有向邊。把首字母和尾字母當成是節點,如果該字母是乙個單詞的首字母,該字母的入度就加一,如果是尾字母,該字母的出度就加一。然後判斷是否形成尤拉迴路即可。尤拉路徑判斷條件 首先該圖必須是連通圖。對於無向圖,所有頂點的讀都為偶數,對於有向圖,要麼所有頂點的入度等於出...

POJ2337 尤拉迴路

題意 給你n個由小寫字母組成的單詞,要求將這n個單詞連線起來,使得前乙個單詞的最後乙個字母和後乙個單詞的第乙個字母相容,輸出字典序最小的解 思路 不難發現此題可以轉化為尤拉路徑問題,把每個字串的第乙個字母當作起點,最後乙個字母當作終點,連一條有向邊,求此圖字典序最小的尤拉路徑。對於有向圖來說,存在一...