p1124字串變換
accepted
標籤: 搜尋 搜尋與剪枝
noip提高組2002
已知有兩個字串 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
每個測試點1s3
noip2002提高組第二題
解析:設從正向開始擴充套件的狀態儲存在q陣列,[l1,l2]為當前正向擴充套件出的狀態,p陣列以及l2,r2的定義類似。
正向每擴充套件出乙個狀態,就在[l2,r2]中暴力查詢是否存在相同的狀態,若有,則得到答案。
逆向擴充套件與正向擴充套件類似。
我這裡採用的是交替擴充套件,即正向擴充套件一次,然後逆向擴充套件一次。當然,也可以每次選擇狀態數更少的那個進行擴充套件,實際上這種方法更好。
**:
#include#include#define maxn 100000
#define max_len 50
using namespace std;
char q[maxn+10][max_len+10];
char p[maxn+10][max_len+10];
char x[10][max_len],y[10][max_len];
int n=0,add[10],xl[10],yl[10];
int main()
if(n==0)
int l1=0,r1=0,s1=0;
int l2=0,r2=0,s2=0;
for(step=1;step<=5;step++)
{for(i=0;i
我的記錄
07-24
accepted
題目討論
發表題目討論
08-23
這個題目比較屌……
05-11
樣例輸出什麼情況
03-24
c++的在linux不能過?
10-31
p1124疑難
10-12
詭異的編譯失敗…請大牛幫忙
10-12
乙個題目理解方面的問題
07-21
21503-19
使用c語言,此題能ac嗎?
02-07
大牛來一下
NOIP2002 字串變換
一道難得的搜尋好題,題目大意很簡單,這裡不再贅述,主要說一下思路 當然普通的bfs答案是正確的,但是在ch上評測會tle乙個點,所以我們採用效率更高的雙向bfs 從初始狀態和目標狀態分別搜尋,建立兩個佇列,分別擴充套件狀態。如果乙個佇列擴充套件的狀態已經被另乙個佇列搜尋過了,那麼便出現答案了。另外,...
NOIP2002 字串變換 題解
字串變換 字串的題以後還是用string吧,很多函式賊有用。思路 雙向bfs,判斷中途相遇,兩個map即可。關鍵是處理字串的替換,找子串可以用string的find 函式,替換可以用string 的 replace 函式.include include include include include...
NOIP 2002 提高組 字串變換
題目描述 已知有兩個字串 a,b 及一組字串變換的規則 至多6個規則 a1 b1 a2 b2 規則的含義為 在 a 中的子串 a1 可以變換為 b1 a2 可以變換為 b2 例如 a abcd b xyz 變換規則為 abc xu ud y y yz 則此時,a 可以經過一系列的變換變為 b,其變換...