noip2002 字串變換 (雙向寬搜,交替擴充套件)

2021-07-04 22:09:35 字數 1714 閱讀 7084

p1124字串變換

accepted

標籤: 搜尋 搜尋與剪枝

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$,其變換的過程為:

『abcd』->『xud』->『xy』->『xyz』

共進行了三次變換,使得 a$ 變換為b$。

第一行為兩個字串,第二行至檔案尾為變換規則

a$ b$

a1$ b1$ \

a2$ b2$ |-> 變換規則

... ... / 

所有字串長度的上限為 20。

若在 10 步(包含 10步)以內能將 a$ 變換為 b$ ,則輸出最少的變換步數;否則輸出"no answer!"

abcd xyz

abc xu

ud y

y yz

3
每個測試點1s

noip2002提高組第二題

解析:設從正向開始擴充套件的狀態儲存在q陣列,[l1,l2]為當前正向擴充套件出的狀態,p陣列以及l2,r2的定義類似。

正向每擴充套件出乙個狀態,就在[l2,r2]中暴力查詢是否存在相同的狀態,若有,則得到答案。

逆向擴充套件與正向擴充套件類似。

我這裡採用的是交替擴充套件,即正向擴充套件一次,然後逆向擴充套件一次。當然,也可以每次選擇狀態數更少的那個進行擴充套件,實際上這種方法更好。

**:

#include#include#define maxn 100000 

#define max_len 50

using namespace std;

char q[maxn+10][max_len+10];

char p[maxn+10][max_len+10];

char x[10][max_len],y[10][max_len];

int n=0,add[10],xl[10],yl[10];

int main()

if(n==0)

int l1=0,r1=0,s1=0;

int l2=0,r2=0,s2=0;

for(step=1;step<=5;step++)

{for(i=0;i

我的記錄

07-24

accepted

題目討論

發表題目討論

08-23

這個題目比較屌……

05-11

樣例輸出什麼情況

03-24

c++的在linux不能過?

10-31

p1124疑難

10-12

詭異的編譯失敗…請大牛幫忙

10-12

乙個題目理解方面的問題

07-21

21503-19

使用c語言,此題能ac嗎?

02-07

大牛來一下

NOIP2002 字串變換

一道難得的搜尋好題,題目大意很簡單,這裡不再贅述,主要說一下思路 當然普通的bfs答案是正確的,但是在ch上評測會tle乙個點,所以我們採用效率更高的雙向bfs 從初始狀態和目標狀態分別搜尋,建立兩個佇列,分別擴充套件狀態。如果乙個佇列擴充套件的狀態已經被另乙個佇列搜尋過了,那麼便出現答案了。另外,...

NOIP2002 字串變換 題解

字串變換 字串的題以後還是用string吧,很多函式賊有用。思路 雙向bfs,判斷中途相遇,兩個map即可。關鍵是處理字串的替換,找子串可以用string的find 函式,替換可以用string 的 replace 函式.include include include include include...

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,其變換...