已知有兩個字串 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 xyzabc xu
ud y
y yz
輸出樣例
3
差不多是一道水題吧。。就是 bfs 暴搜就行。只不過在搜的時候要注意以下幾點:
1.每一次是如何變換的
1string 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(conststring&now)
6return
ret;
7 }
完整**
1 #include 2 #include3 #include4 #include5 #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所需的最小的轉換次...