by medalplus
【題目描述】
已知有兩個字串 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!"
【分析】
一開始拿到題目感覺有的懵懵噠,然後就明白了,這裡翻譯一下火星文:
給你兩個字串s1,s2,再給你許多許多變換方式使得s1=s2,求最少步數,大於10就輸出no answer
我想,這不就是搜尋求最優值問題麼?然後就自然地想到了迭代加深(這裡不贅述)
也就是最多層次為10,結果還是莫名其妙的tle了。。。
然後算了一下,對於變換方式,可能有許多許多,這也就意味著解空間樹不是乙個二叉樹,k叉樹!也就是nk的複雜度,很明顯tle麼。。
為什麼要用迭代加深呢?怕空間不夠!來算一下空間,20*20*19/2<107所以也就是虛驚一場,其實空間足夠大
但是普通的bfs絕對會tle的,這題有個特點,那就是知道起始點和終止點
然後我們採用雙向bfs,加快速度
然後就ac了
【**】
1 #include 2 #include 3 #include4 #include 5 #include 6 #include 7
using
namespace
std;89
const
int maxn=1001;10
11struct
node;
1516
intl;
17string c[maxn],c_[maxn];//
c=>c_
18string
s1,s2;
19 maphash_f,hash_b;
20 queuef,b;
2122
string getstr(string s,int l,int
r)28
29void
expand_f()
49if(hash_f[res])continue;50
else hash_f[res]=head.dfn+1
;51 f.push((struct node));
52 res=cc;53}
54}55}
5657
void
expand_b()
77if(hash_b[res])continue;78
else hash_b[res]=head.dfn+1
;79 b.push((struct node));
80 res=cc;//
clear81}
82}83}
8485
void
bfs());
90 b.push((struct node));
91while(1
)100
else
104}
105}
106107
intmain()
114 l--;
115bfs();
116 printf("
no answer!");
117return0;
118 }
洛谷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 字串變換
洛谷 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 其變換的過程為...