題目描述
已知有兩個字串 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!"
輸入輸出樣例
輸入樣例#1:
abcd xyzabc xu
ud y
y yz
輸出樣例#1:
3
表示做題時感到了noip深深的惡意……
這道題並不容易用比較快的資料結構實現,比如我的字元陣列強迫症和模擬佇列強迫症就被壓得很慘,直接被教做人
好在資料並不大,最多求十步,反覆提交發現只有不到十種變換方式,所以還是可以用string和stl que的,如果資料大,強迫症真得被搞死
所以如果可以用string和stl que的話,這題還比較好解
主要思想是如果當前能夠變換就進行變換,然後把變換過的放入隊尾,什麼時候對頭是變換完成的就直接輸出步數
但是會超時,所以需要剪枝,可能有的串先變換與後變換變出的串相同,所以乙個串只需記錄第一次出現的情況,後來的步數肯定比第一次的步數多,所以不要,可以用乙個map實現,儲存如果串出現了,就將bool變為1,蠻巧妙地就將重複的情況解決了
而替換字串是重點,這就是為什麼不用字元陣列,因為字串有函式,實在是好使,大殺器一樣,這個函式叫做 .replace(a,len,b),有三個引數,大概用法就是將字串a後的len位替換為字串b,與字串b的大小無關,就是說b多長都能塞到len大小的空當裡
上**:
1 #include2 #include3 #include4 #include5 #include6using
namespace
std;
7int way=1;8
string start,end,a[11],b[11];9
struct
dataaa;
13 queueque;//
佇列記錄當前情況字串以及步數
14 mapm;
15int
main()
31if(temp.s==end)
35string t=temp.s;
36int len=t.length();
37string
next;
38for(int i=1;i<=way;i++)51}
52}53}
54}55return0;
56 }
NOIP2002 提高組 複賽 均分紙牌
noip2002 提高組 複賽 均分紙牌 1.看完題,第一想法就是,算出均分後的紙牌張數,與每個位置紙牌數作差,統計負的數個數,與正的數個數,取其中最大個數,即為最少移動次數,當然此種做法估計無法ac,但猜測能拿50分左右,沒有其他想法的時候,就按這個辦法試試吧。2.提交,5組資料,通過2組,得分4...
NOIP2002 字串變換
一道難得的搜尋好題,題目大意很簡單,這裡不再贅述,主要說一下思路 當然普通的bfs答案是正確的,但是在ch上評測會tle乙個點,所以我們採用效率更高的雙向bfs 從初始狀態和目標狀態分別搜尋,建立兩個佇列,分別擴充套件狀態。如果乙個佇列擴充套件的狀態已經被另乙個佇列搜尋過了,那麼便出現答案了。另外,...
NOIP2002 提高組之一 均分紙牌
有 n 堆紙牌,編號分別為 1,2,n。每堆上有若干張,但紙牌總數必為 n 的倍數。可以在任一堆上取若於張紙牌,然後移動。移牌規則為 在編號為 1 堆上取的紙牌,只能移到編號為 2 的堆上 在編號為 n 的堆上取的紙牌,只能移到編號為 n 1 的堆上 其他堆上取的紙牌,可以移到相鄰左邊或右邊的堆上。...