剛開始我覺得應該使用dfs來做吧...因為可替換的子串有多種選擇,一種換下來不行(超過10步)就捨棄。
但仔細想想,因為要比較得到最小的步數,所以豈不是每種可能性都會去試10步??複雜度太高了!!!
謹記:一般的,求解的個數用深搜,求最優解用廣搜。
為什麼呢?
因為對於bfs,它有個step(不管你是寫陣列還是寫在結構體裡),都是每次去傳step+1給當前的下一種可能性的,
由於是用「佇列」儲存,所以一定是按「step」的從小到大的順序來依次出棧+檢視的(先進先出)!所以,第一次滿足條件的,即是
最優的、步數最少的解。
這樣是很有效率的,不像dfs要全盤試完(每種都要試到底)來比較得最優。
不過還是有些細節需要考慮:
①輸入的時候沒告訴我輸入多少組,怎麼辦?按機試書上的做法,就是while(scanf("%d",&n)!=eof) ,但那是說每組首先輸入的是乙個數字的情況。此題是每組直接輸入兩個字串,怎麼判斷?
——利用cin也有返回值的特性:
while(cin>>rules[n][0]>>rules[n][1]) //學習這個輸入方法!靈活用cin
②字串裡找子串,是直接用find函式來返回第一次的出現位置嗎?
但本題不能用find,特殊在有可能有這種情況:我需要替換後面的,但不替換前面的。
所以只能在原串裡挨個順序的找看看從這裡開始是不是可替換的子串,是則替換試試。
③字串中的替換,可用replace函式
str.replace(起始下標,被替換的子串長度,新子串)
#include#includeusing namespace std;
#include string a,b;
string rules[10][2];
int n=0;
mapm;
struct node
};string trans(const string &ori,int tran_index,int index) //原串,替換的串在陣列中的下標,原串中的下標
//接下來檢視是否有包含可替換的子串(一般用string的find函式來獲得首次位置,但仔細一想,此題有可能出現多處而替換後不替換前!!!
for(int i=0;i>a>>b;
while(cin>>rules[n][0]>>rules[n][1]) //學習這個輸入方法!靈活用cin
bfs();
if(ans==-1||ans>10)
cout<
else
cout<
return 0;
}
LuoguP1032 字元變換(BFS)
題目鏈結為 思路 看到資料比較小,而且最多有6個規則,就可以用搜尋去做了,我用的bfs,大體思路如下 定義結構體表示狀態,其中包括字串str和當前步數num 並定義該結構體的佇列 用map實現string到int的對映,用來記錄某個狀態是否到達過,若到達過,標記為1,否則為0 bfs函式中就是bfs...
洛谷1032 字串變換
已知有兩個字串 a b 及一組字串變換的規則 至多6個規則 a1 b1 a2 b2 規則的含義為 在 a 中的子串 a1 可以變換為 b1 a2 可以變換為 b2 例如 a abcd b xyz 變換規則為 abc xu ud y y yz 則此時,a 可以經過一系列的變換變為 b 其變換的過程為 ...
P1032 字串變換
思路 採用bfs 我們遍歷字串a的每個字元,判斷當前字串i位置之後可不可以替換,如果可以替換,我們就把替換後的字串 a 放入佇列。如果出現的我們想要的字串,根據bfs的性質,那麼就直接記錄此時的步數。1 include 2 include 3 include 4 include 5 include ...