搜尋練習 2002t2字串變換

2021-08-08 18:44:14 字數 1250 閱讀 7733

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 xyz

abc 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的最短路,交替節點搜尋 ...