POJ4128單詞序列

2021-08-08 08:40:37 字數 1869 閱讀 1018

描述

給出兩個單詞(開始單詞和結束單詞)以及乙個詞典。找出從開始單詞轉換到結束單詞,所需要的最短轉換序列。轉換的規則如下:

1、每次只能改變乙個字母

2、轉換過程中出現的單詞(除開始單詞和結束單詞)必須存在於詞典中

例如:開始單詞為:hit

結束單詞為:cog

詞典為:[hot,dot,dog,lot,log,mot]

那麼一種可能的最短變換是: hit -> hot -> dot -> dog -> cog,

所以返回的結果是序列的長度5;

注意:1、如果不能找到這種變換,則輸出0;

2、詞典中所有單詞長度一樣;

3、所有的單詞都由小寫字母構成;

4、開始單詞和結束單詞可以不在詞典中。

輸入共兩行,第一行為開始單詞和結束單詞(兩個單詞不同),以空格分開。第二行為若干的單詞(各不相同),以空格分隔開來,表示詞典。單詞長度不超過5,單詞個數不超過30。

輸出輸出轉換序列的長度。

樣例輸入

hit cog

hot dot dog lot log

樣例輸出

本道題的思路:本題採用寬度優先搜尋bfs,首先構造乙個類,每個物件包含其字串和步數,定義乙個佇列,裡面包含字典內可以匹配的字串
以及最後的目標字串,目標字元竄的step加上1就是最後的最短序列長度。因為是橫向的bfs,故佇列中第乙個目標字串對應的step就是最小
的。例如這道題的例項,可以分析出來佇列的元素:step:    0     1      2     2      2       3       3      4
s:   hit    hot   dot    lot    mot    dog     log    cog
引入visited[n]的目的:例如都只差了乙個字母,當訪問dot或者hot值時,因為visited【hot】=1,不將hot壓入佇列!
/*  poj  4128單詞序列  廣度搜尋的應用   */

#include#include#include#includeusing namespace std;

class node

};string string_start;//源字串

string string_end;//目的字串

string diction[35];//存放字典

int flag = 0;//標誌位,如果為0則說明不能通過變換得到目標值

int length;//單詞的長度

int visited[35];

int cnt = 0;//字典內單詞的個數,初始化為0

//函式說明:檢查string型別的a,如果a等於目的字串,返回cnt,如果等於字典內容,返回下標,如果啥也不是,返回-1,返回-1啥也不做,其他值,統統將a壓入佇列

int check_in_diction(string a)

for (int i = 0; i < cnt; i++) }

return -1;

}void bfs(node a)

else

//lei_si字串啥也不是,直接跳過迴圈,換成其他字串

else}}

}que.pop();

} }}int main()

memset(visited, 0, sizeof(visited));

length = string_start.size();//單詞的長度

bfs(node(string_start, 0));

if (flag == 0)

return 0;

}

poj 單詞序列

描述 給出兩個單詞 開始單詞和結束單詞 以及乙個詞典。找出從開始單詞轉換到結束單詞,所需要的最短轉換序列。轉換的規則如下 1 每次只能改變乙個字母 2 轉換過程中出現的單詞 除開始單詞和結束單詞 必須存在於詞典中 例如 開始單詞為 hit 結束單詞為 cog 詞典為 hot,dot,dog,lot,...

翻轉單詞序列

題目描述 牛客最近來了乙個新員工fish,每天早晨總是會拿著一本英文雜誌,寫些句子在本子上。同事cat對fish寫的內容頗感興趣,有一天他向fish借來翻看,但卻讀不懂它的意思。例如,student.a am i 後來才意識到,這傢伙原來把句子單詞的順序翻轉了,正確的句子應該是 i am a stu...

翻轉單詞序列

題目 牛客最近來了乙個新員工fish,每天早晨總是會拿著一本英文雜誌,寫些句子在本子上。同事cat對fish寫的內容頗感興趣,有一天他向fish借來翻看,但卻讀不懂它的意思。例如,student.a am i 後來才意識到,這傢伙原來把句子單詞的順序翻轉了,正確的句子應該是 i am a stude...