描述
給出兩個單詞(開始單詞和結束單詞)以及乙個詞典。找出從開始單詞轉換到結束單詞,所需要的最短轉換序列。轉換的規則如下:
1、每次只能改變乙個字母
2、轉換過程中出現的單詞(除開始單詞和結束單詞)必須存在於詞典中
例如:開始單詞為:hit
結束單詞為:cog
詞典為:[hot,dot,dog,lot,log,mot]
那麼一種可能的最短變換是: hit -> hot -> dot -> dog -> cog,
所以返回的結果是序列的長度5;
注意:1、如果不能找到這種變換,則輸出0;
2、詞典中所有單詞長度一樣;
3、所有的單詞都由小寫字母構成;
4、開始單詞和結束單詞可以不在詞典中。
輸入共兩行,第一行為開始單詞和結束單詞(兩個單詞不同),以空格分開。第二行為若干的單詞(各不相同),以空格分隔開來,表示詞典。單詞長度不超過5,單詞個數不超過30。
輸出輸出轉換序列的長度。
樣例輸入
hit coghot 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...