description
已知有兩個字串 a$, b$ 及一組字串變換的規則(至多6個規則):
a1$ -> b1$
a2$ -> b2$
規則的含義為:在 a$中的子串 a1$ 可以變換為 b1$、a2$ 可以變換為 b2$ …。
例如:a$='abcd' b$='xyz'
變換規則為:
『abc』->『xu』 『ud』->『y』 『y』->『yz』
則此時,a$ 可以經過一系列的變換變為 b$,其變換的過程為:
『abcd』->『xud』->『xy』->『xyz』
共進行了三次變換,使得 a$ 變換為b$。
input
第一行,兩個字串a$, b$;
第二行—檔案結束是字串變換規則,每行一條規則:
a1$ b1$
a2$ b2$
.. . ...
所有字串長度的上限為 20。
output
僅一行,若在 10 步(包含 10步)以內能將 a$ 變換為 b$ ,則輸出最少的變換步數;否則輸出"no answer!"
sample input
abcd xyzabc xu
ud y
y yz
sample output
3字串的處理stl還是挺有用的
就像substr
包括c++的map和stl中的堆啊,佇列什麼的都相當省事兒,當然時間複雜度常數會比手寫要高
這道題主要考察bfs。。。
#include
#include
#include
#include
#include
#include
using namespace std;
const int maxn=1010;
string a[maxn],b[maxn],c,d;
struct data
;queueq;
mapk;
int n;
int main()
);while(!q.empty()));}
if(ch==d)}}
}}cout<<"no answer!";
return 0;}
NOIP2002 字串變換
一道難得的搜尋好題,題目大意很簡單,這裡不再贅述,主要說一下思路 當然普通的bfs答案是正確的,但是在ch上評測會tle乙個點,所以我們採用效率更高的雙向bfs 從初始狀態和目標狀態分別搜尋,建立兩個佇列,分別擴充套件狀態。如果乙個佇列擴充套件的狀態已經被另乙個佇列搜尋過了,那麼便出現答案了。另外,...
NOIP2002 字串變換 題解
字串變換 字串的題以後還是用string吧,很多函式賊有用。思路 雙向bfs,判斷中途相遇,兩個map即可。關鍵是處理字串的替換,找子串可以用string的find 函式,替換可以用string 的 replace 函式.include include include include include...
雙向BFS NOIP2002 字串變換
如果目標也已知的話,用雙向bfs能很大提高速度 單向時,是 b len的擴充套件。雙向的話,2 b len 2 快了很多,特別是分支因子b較大時 至於實現上,網上有些做法是用兩個佇列,交替節點搜尋 如下面的偽 while empty 但這種做法是有問題的,如下面的圖 求s t的最短路,交替節點搜尋 ...