2002提高 字串變換

2021-06-05 18:49:34 字數 1407 閱讀 4001

【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 xyz

abc 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...