Word ladders II

此題煩擾我多天,核心算法實際上就是書上給出的僞代碼,需要認真閱讀!但仍有許多部分需要完善
核心思想的僞代碼

先貼代碼
#include “string”
#include “lexicon.h”
#include “queue.h”
#include “simpio.h”
#include “vector.h”
#include “console.h”
#include “map.h”
#include

using namespace std;

Vector Findladders(const string &start,const string &end,const Lexicon wordlist)
{
Queue<Vector> paths;
Vector first;
Set usedword;
Vector shortest;//表示當前處理路徑
first.add(start);
paths.add(first);
usedword.add(start);

while(!paths.isEmpty())
{
    shortest =paths.dequeue();
    string lastword = shortest.back();
    if(lastword == end)
    {cout<<"Found ladder:";
    return shortest;}
    else
    {

        for(int a=0; a<lastword.length(); a++)
        {
            for(char b ='a'; b<='z';b++)
            {   string copy = lastword;
                copy[a] = b;
                if (wordlist.contains(copy) && !usedword.contains(copy))
                {
                    usedword.add(copy);
                    Vector<string> laddercopy = shortest;
                    laddercopy.add(copy);
                    paths.add(laddercopy);
                }
            }
        }

    }

}
cout<<"No ladder found";
Vector<string> a;
return a;

}
int main() {

// [TODO: fill in the code]
Lexicon wordlist("EnglishWords.txt");
while(true)
{
   string start = ""; string end = "";
   Vector<string>ladders;
   cout<<"Enter start word(RETURN to quit): ";
   cin>>start;
   cout<<"Enter distination word: ";
   cin>>end;
   ladders = Findladders(start,end,wordlist);
   cout<<ladders<<endl;
}
return 0;

}
運行結果:
運行結果
要求輸出一個最短的結果,用DFS,將單詞變化(只有一個字母與前一個單詞不同)的所有可能路徑(實際上是從短到長)存放在一個Queue<Vector>裏,當有一個路徑終點是目標單詞時,我們則找到了最短的路徑。我們根據Queue的先入先出原則,每次都從頭開始選擇一個路徑,判斷它是否是目標路徑,若不是,則刪除。
存在幾個問題:
1) 我們輸入的起始單詞是一個string,如何轉化爲一個只含這一個單詞的路徑?
實際上,我們的實現函數爲:VectorFindladder(const string & start, const string &end, const Lexicon & wordlist>【注意參數的傳遞形式!】
函數一開始就定義Queue、Vector變量,將string add入Vector,Vector add入Queue裏,即可解決。
2) 因爲所有單詞的引用都是const,所以當需要修改單詞時,就要複製一個拷貝

主體是一個while函數,當結尾單詞非目標單詞時,我們需要將當前路徑複製一個拷貝,把新變化的單詞加入到這個複製的路徑中去,再將這個複製的並添加了一個單詞的路徑加入到路徑集Vector中去。因爲原來的路徑要被刪除,新生成的路徑與原來的路徑只差一個單詞,所以1.我們需要複製 2.這個路徑集裏的路徑長度是遞增的:先生成所有長度爲2的路徑,再生成所有長度爲3的路徑……可知我們求得的第一個目標路徑就是最短的。
還要注意用一個Vectorusedword保存使用過的單詞,避免產生死循環。

存在一些疑問:題目提示用Vector儲存每一個路徑,可是輸出時每個單詞就會帶引號(示例中不帶引號),如何處理?
No ladder found時如何不輸出空Vector?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章