問題描述:
給了a、b兩個單詞和乙個單詞集合dict,每個的長度都相同。我們希望通過若干次操作把單詞a變成單詞b,每次操作可以改變單詞中的乙個字母,同時,新產生的單詞必須是在給定的單詞集合dict中。求所有行得通步數最少的修改方法。
舉個例子如下:
given: a = "hit" b = "cog" dict = ["hot","dot","dog","lot","log"]
return: [ ["hit","hot","dot","dog","cog"], ["hit","hot","lot","log","cog"] ]
即把字串a = "hit"轉變成字串b = "cog",有以下兩種可能:
"hit" -> "hot" -> "dot" -> "dog" -> "cog";
"hit" -> "hot" -> "lot" -> "log" ->"cog"。
注:a和b相同的情況下不需要做轉換,此時直接返回空集。
哎,下面的**計算結果應該沒問題,但提交以後計算超時……求更快的演算法啊
#include #include #include #include #include #include #include #include #include using namespace std;
/**需求:給定乙個無向圖,指定圖中兩點,要求輸出圖中此兩點間所有最短路徑;
簡單的bfs演算法不能求出所有的最短路徑,本問題解決思路參考:
演算法思想描述:
1. 整理節點間的關係,為每個節點建立乙個集合,該集合中儲存所有與該節點直接相連的節點(不包括該節點自身);
2. 定義兩點乙個為起始節點,另乙個為終點,求解兩者之間的所有路徑的問題可以被分解為如下所述的子問題:對每一 個與起始節點直接相連的節點,求解它到終點的所有路徑(路徑上不包括起始節點)得到乙個路徑集合,將這些路徑集合相加就可以得到起始節點到終點的所有路徑;依次類推就可以應用遞迴的思想,層層遞迴直到終點,若發現希望得到的一條路徑,則轉儲並列印輸出;若發現環路,或發現死路,則停止尋路並返回;
3. 用棧儲存當前已經尋到的路徑(不是完整路徑)上的節點,在每一次尋到完整路徑時彈出棧頂節點;而在遇到從棧頂節點無法繼續向下尋路時也彈出該棧頂節點,從而實現回溯。
**/class solution
//cout<::iterator it="result.begin()," it_tmp>
unsigned u_min = it->size();
for(++it; it != result.end(); ++it)
it = result.begin();
for(; it != result.end(); ++it)
return real_result;
}private:
void createneighbors(string start, string end, set& dict)
tmpvect.push_back(end);
//then construct the neighbors
size_t len = tmpvect.size();
for(size_t i = 0; i < len; ++i)
m_neighbors[tmpvect[i]]->push_back(tmpvect[j]);}}
}//print neighbors
for(map* >::iterator miter = m_neighbors.begin(); miter != m_neighbors.end(); ++miter)
cout<1) return 0u;}}
return ucnt;}//
bool findpath(string current_node, string parent_node,
string start_node, string end_node,
vector>& result)
if(!current_node.empty())
else
listiter next_node = m_neighbors[current_node]->begin();
while(m_neighbors[current_node]->end() != next_node)
if(findpath(*next_node, current_node, start_node, end_node, result))
++next_node;
}m_deque.pop_back();
return false;}}
else
}private:
map* > m_neighbors;
dequem_deque;
};int main()
{ solution ss;
setdict;
dict.insert(string("hot"));
dict.insert(string("iot"));
dict.insert(string("iat"));
dict.insert(string("cat"));
dict.insert(string("cag"));
vector> result = ss.findladders("hit", "cog", dict);
//print result
for(size_t idx=0; idx < result.size(); ++idx){
copy(result[idx].begin(), result[idx].end(), ostream_iterator(cout, ", "));
cout<
龐果網 最小公倍數
最小公倍數 題目詳情 問題描述 給你n組測試資料,每組測試資料有m 0 input 輸入n,隨後有n行,每行開頭輸入m,m之後有m個正整數,相鄰數之間用空格隔開。output 每行輸出乙個數 該數在int範圍內,同時,數前面加個 case 1 表示第幾個case,如 case 1 6 相鄰兩組結果之...
Wannafly挑戰賽25 C 期望運算元
nqijij 有乙個數x,和乙個神秘權值 q,滿足 x q,每一次nqijij會隨機x 變成 x,q 中的乙個隨機數,nqijij想要知道期望多少次操作之後x 變為q。由於nqijij 是乙個精力充沛的人,所以他總共會選擇 t 次x 和q 進行操作,對於每一次操作,你需要輸出期望多少次操作之後x 變...
牛客網 Wannafly挑戰賽21 A 燈塔
題目鏈結 題目描述 z市是一座港口城市,來來往往的船隻依靠燈塔指引方向。在海平面上,存在n個燈塔。每個燈塔可以照亮以它的中心點為中心的90 範圍。特別地,由於特殊限制,每個燈塔照亮範圍的角的兩條邊必須要麼與座標軸平行要麼與座標軸成45 由於經費限制,z市的燈塔只能被點亮一座。你需要求出在這種情況下,...