NOIP 2002 提高組 字串變換

2022-08-10 17:21:18 字數 1752 閱讀 6211

題目描述

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

abc 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 #include6

using

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 的堆上 其他堆上取的紙牌,可以移到相鄰左邊或右邊的堆上。...