【2002提高】字串變換
time limit:10000ms memory limit:65536k
total submit:28 accepted:3
case time limit:1000ms
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
source
xinyue摘自noip2002提高組
**:分析:
雙向bfs:
所謂雙向搜尋指的是搜尋沿兩個方向同時進行:
1.正向搜尋:從初始結點向目標結點方向搜尋。
2.逆向搜尋:從目標結點向初始結點方向搜尋。
當兩個方向的搜尋生成同一子結點時終止此搜尋過程。
雙向搜尋通常有兩種方法:
1. 兩個方向交替擴充套件。
2. 選擇結點個數較少的那個方向先擴充套件。
方法2克服了兩方向結點的生成速度不平衡的狀態,明顯提高了效率。
#includeusing namespace std;
struct node
list1[5010],list2[5010];
char a[7][30],b[7][30];
int n;
bool check(char *s1,char *s2)
for ( i=0;i
NOIP 2002 提高組 字串變換
題目描述 已知有兩個字串 a,b 及一組字串變換的規則 至多6個規則 a1 b1 a2 b2 規則的含義為 在 a 中的子串 a1 可以變換為 b1 a2 可以變換為 b2 例如 a abcd b xyz 變換規則為 abc xu ud y y yz 則此時,a 可以經過一系列的變換變為 b,其變換...
NOIP2002 字串變換
一道難得的搜尋好題,題目大意很簡單,這裡不再贅述,主要說一下思路 當然普通的bfs答案是正確的,但是在ch上評測會tle乙個點,所以我們採用效率更高的雙向bfs 從初始狀態和目標狀態分別搜尋,建立兩個佇列,分別擴充套件狀態。如果乙個佇列擴充套件的狀態已經被另乙個佇列搜尋過了,那麼便出現答案了。另外,...
NOIP2002 字串變換 題解
字串變換 字串的題以後還是用string吧,很多函式賊有用。思路 雙向bfs,判斷中途相遇,兩個map即可。關鍵是處理字串的替換,找子串可以用string的find 函式,替換可以用string 的 replace 函式.include include include include include...