8468:單詞序列
總時間限制: 1000ms 記憶體限制: 1024kb
描述 給出兩個單詞(開始單詞和結束單詞)以及乙個詞典。找出從開始單詞轉換到結束單詞,所需要的最短轉換序列。轉換的規則如下:
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
樣例輸出
5乙個比較簡單的bfs。(mdzz又被卡在讀入,坑爹的字串)
開乙個bool陣列記錄某個字母是否在字典裡出現過,開乙個map記錄:字典裡的單詞是否出現過。
還要開乙個map vis,就是bfs裡的判重…
在搜的時候,對於乙個單詞的每個位置,列舉26個字母,如果這個字母沒有在字典裡出現,直接忽略。如果出現過,用當前字母代替單詞的當前位置,如果當前單詞是第一次出現,那走到當前單詞的步驟數就等於隊首元素的步驟數+1(根據bfs的性質),如果當前單詞==結束單詞,輸出步驟數+1直接return。
輸出轉換序列的長度。注意是序列長度而不是步驟數,所以輸出步驟數+1。
#include
#include
#include
#include
#include
#include
using
namespace
std;
mapuse;
mapvis;
const
int inf=0x7ffffff;
char haha=;
bool used[30];
string st;
string ed;
int len;
struct meico
;void get(string &hah)
hah=ans;
return;
}int ans=inf;
queue
q;bool flag;
void bfs()
if(use[cg])
);// cout<}}}
}}
q.pop();
}}int main()
use[ha]=1;
}q.push((meico));
bfs();
if(!flag)
return
0;}
noi openjudge 數字組合
有n個正整數,找出其中和為t t也是正整數 的可能的組合方式。如 n 5,5個數分別為1,2,3,4,5,t 5 那麼可能的組合有5 1 4和5 2 3和5 5三種組合方式。輸入的第一行是兩個正整數n和t,用空格隔開,其中1 n 20,表示正整數的個數,t為要求的和 1 t 1000 接下來的一行是...
NOI OpenJudge 7627 雞蛋的硬度
描述 有n層樓,m個雞蛋,如果雞蛋從第a層摔下來沒摔破,但是從a 1層摔下來時摔破了,那麼就說這個雞蛋的硬度是a。這些雞蛋硬度相同,在求雞蛋的硬度下問使用最優策略在最壞情況下所需要的扔雞蛋次數。樣例輸入 100 1 100 2樣例輸出 100 14這道題用的是動態規劃。f i j 表示i層樓j個雞蛋...
noi openjudge 4 7搜尋 懷錶問題
為啥我覺得這是個dp f i j k l 表示四種零件分別用了i,j,k,l個的方案數。然後發現這樣不能保證表一定能接在錶鏈首尾,也不知道狀態之間如何轉移,那麼加一維變成f i j k l s s表示首尾的狀態 4種 於是就可以預處理了。然後我們需要從給出的一共n個4種零件中選出k個。那麼dfs暴力...