OpenJudge 2 5 8783 單詞接龍

2021-08-03 12:57:39 字數 1572 閱讀 4832

description

單詞接龍是乙個與我們經常玩的成語接龍相類似的遊戲,現在我們已知一組單詞,且給定乙個開頭的字母,要求出以這個字母開頭的最長的「龍」(每個單詞都最多在「龍」中出現兩次),在兩個單詞相連時,其重合部分合為一部分,例如beast和astonish,如果接成一條龍則變為beastonish,另外相鄰的兩部分不能存在包含關係,例如at和atide間不能相連。

input
輸入的第一行為乙個單獨的整數n(n<=20)表示單詞數,以下n行每行有乙個單詞(只含有大寫或小寫字母,長度不超過20),輸入的最後一行為乙個單個字元,表示「龍」開頭的字母。你可以假定以此字母開頭的「龍」一定存在。

output

只需輸出以此字母開頭的最長的「龍」的長度。

sample input

5

attouch

cheat

choose

tact

a

sample output

23

在講這道題之前,先說一點題外話:其實剛開始讀到這道題的時候是抗拒的,所以一直沒有去碰,後面是布置任務下來了才去做的,所以在面對一道題時不要有畏難情緒。其實這道題還是蠻簡單的(雖然做了好久好久...)

這種題一來果斷string,用char的話就要定義二維,用string陣列,乙個元素就是乙個單詞。

這道題據說有人是將龍全部接上去了的,我沒有那麼做,只計算了長度。思路就是回溯法,只不過最後那個判斷外面要加一些東西:外層迴圈仍然列舉,列舉每乙個單詞,如果它的使用次數<2(需定義bool標記),就列舉被接龍單詞的每乙個字母,與接龍單詞的首字母比較,找出接龍起點。記錄下

兩個單詞的

接龍起點,再用while依次比對到被接龍單詞末尾,如果while中被接龍單詞的接龍起點到達了末尾(也就是說while迴圈到了最後,所有字母全都匹配,可以接龍),就開始接龍(回溯)。

先奉上**:

#include#include#include#includeusing namespace std;

string a[21];

int n,maxn,used[21],l=1;

void dfs(int c)//a[c]已定單詞,a[i]接龍單詞

有幾點需要特別說明的:

1.它是要求最長,前面找接龍起點可以倒序找,只要找到乙個就break,我這麼寫也會找到,因為我雖然順序查詢但是沒有break,所以最終還是會查詢到,但是耗時要長一些。

2.找接龍起點以及接龍長度(就是包括while那一段)可以用a.substr(i,j)這個函式來做,i表示查詢起點(位置),j表示長度。

3.有乙個我想了很久但是很懵的問題:我把lc,li定義在dfs()裡面就沒問題,但是定義在外面就會錯。剛開始以為是回溯遞迴會影響到值,但是每次找到接龍起點時都重新附了值。然後我對比了兩種方法lc,li以及a

[i].lengrh()-li的值,都一樣,但只要加上l(l+=a

[i].lengrh()-li那裡),值就會錯,甚至有負數。

openjudge 數字統計

總時間限制 1000ms 記憶體限制 100000kb 描述輸入n個整數,統計每個數出現的次數.輸入 第一行是乙個整數n 1 n 1000 接下來n行每行乙個整數.輸出 第一行輸出總共有多少個不同的整數.接下來每行輸出乙個整數及這個整數出現的次數,用空格分隔.輸出的整數的順序與它們在輸入中第一次出現...

Openjudge 括號匹配

這個用了普通的迴圈,資料量不是很大的話效率還是不錯的,如果資料比較大的話,換別的方法可能效率會高一點。思路很簡單 以字串中是否還存在沒有匹配過的 作為這個字串已經處理完畢的標誌。1,讀入字串,並進行處理,把所有不是 和 的字元都轉換成空格。2,從開始掃瞄字串,如果掃瞄到 記錄 的位置,直到掃瞄到 3...

openjudge 移動路線

描述 桌子上有乙個m行n列的方格矩陣,將每個方格用座標表示,行座標從下到上依次遞增,列座標從左至右依次遞增,左下角方格的座標為 1,1 則右上角方格的座標為 m,n 小明是個調皮的孩子,一天他捉來乙隻螞蟻,不小心把螞蟻的右腳弄傷了,於是螞蟻只能向上或向右移動。小明把這只螞蟻放在左下角的方格中,螞蟻從...