洛谷 P1032 字串變換

2022-05-09 15:46:54 字數 2424 閱讀 5036

已知有兩個字串 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

差不多是一道水題吧。。就是 bfs 暴搜就行。只不過在搜的時候要注意以下幾點:

1.每一次是如何變換的

1

string change(const

string& now, int st, int num) //

now字串第st位,第num條變換規則 28

string

ret;9//

變換分三步

10for(int i = 0; i < st; ++i) ret += now[i];//

1.將原字串不用變換的前半部分複製下來

11 ret += b1[num]; //

2.再加上變換部分

12for(int i = st + a1[num].length(); i < now.length(); ++i) ret += now[i];//

3.加上原字串剩下部分

13return

ret;

14 }

用 string 的好處是,它支援加減運算,就是增加或減去某一字串,而不用庫里的 strcpy 函式。

2.再用bfs時,要記錄之前的狀態,防止又退回去,進入死迴圈。但這道題開 vis 陣列就不太合適,因為每乙個狀態是乙個字串。所以最好開乙個 map 來記錄狀態,並判重。

3.若按 2 的方法,因為是字串的操作,大資料可能會超時,所以可以將字串編碼為 unsigned long long,乙個簡單的hash

1 ull hash(const

string&now)

6return

ret;

7 }

完整**

1 #include 2 #include3 #include4 #include

5 #include6 #include7 #include8

using

namespace

std;

9 typedef unsigned long

long

ull;

10const

int maxn = 25;11

string

a, b;

12string a1[8], b1[8

];13

int cnt = 0

;14 ull hash(const

string&now)

19return

ret;20}

21string change(const

string& now, int st, int

num)

2228

string

ret;

29for(int i = 0; i < st; ++i) ret +=now[i];

30 ret +=b1[num];

31for(int i = st + a1[num].length(); i < now.length(); ++i) ret +=now[i];

32return

ret;33}

34 mapint>mp; //

相當於vis

35void

bfs()

3655}56

}57}58

}59 printf("

no answer!\n");

60}61int

main()

62

值得一提的是,這裡的 map 發揮了兩個作用,乙個是 vis 陣列,另乙個是相當於記錄步數的 dis陣列

洛谷 P1032 字串變換

洛谷 p1032 字串變換 題目描述 已知有兩個字串 a,b 及一組字串變換的規則 至多6個規則 a1 b1 a2 b2 規則的含義為 在 a 中的子串 a1 可以變換為 b1 a2 可以變換為 b2 例如 a abcd b xyz 變換規則為 abc xu ud y y yz 則此時,a 可以經過...

洛谷 P1032 字串變換

已知有兩個字串 a,b 及一組字串變換的規則 至多 6 個規則 a1 b1 a2 b2 規則的含義為 在a 中的子串 a1 可以變換為 b1 a2可以變換為 b2 例如 a abcd bb xyz 變換規則為 abc xu ud y y yz 則此時,a 可以經過一系列的變換變為 b 其變換的過程為...

洛谷P1032字串變換

題目描述 已知有兩個字串a,b a,b 及一組字串變換的規則 至多6個規則 a1 b1 a 1 b1 a2 b2 a 2 b2 規則的含義為 在a的子串中a1 a 1可以變成b1 b 1,a2 a 2可以變成b2 b 2 求a a 變成b role presentation b b所需的最小的轉換次...