生活随笔
收集整理的這篇文章主要介紹了
P1032 字串变换(bfs)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
https://www.luogu.org/problemnew/show/P1032
題目描述
已知有兩個字串A,BA,B及一組字串變換的規(guī)則(至多66個規(guī)則):
A 1-> B 1
A 2 -> B 2
?
規(guī)則的含義為:在 A中的子串A 1
?可以變換為 B 1,A 2可以變換為B 2
? …。
例如:A='abcd'B='xyz'
變換規(guī)則為:
‘a(chǎn)bc’->‘xu’‘ud’->‘y’‘y’->‘yz’
則此時,A可以經(jīng)過一系列的變換變?yōu)锽,其變換的過程為:
‘a(chǎn)bcd’->‘xud’->‘xy’->‘xyz’
共進行了3次變換,使得AA變換為BB。
輸入輸出格式
輸入格式:
輸入格式如下:
AA BB
A 1 B 1
A 2 B 2
|-> 變換規(guī)則
… … /
所有字符串長度的上限為20。
輸出格式:
輸出至屏幕。格式如下:
若在10步(包含10步)以內(nèi)能將A變換為B,則輸出最少的變換步數(shù);否則輸出"NO ANSWER!"
輸入輸出樣例
輸入樣例#1:
abcd xyz
abc xu
ud y
y yz
輸出樣例#1:
3
ac_code:
/*
每個點是一個字符串,想到用map標記~
之前用dfs做只有60分,然后第一次用bfs做80分,最后組數(shù)據(jù)WA
WA的點就是,沒有考慮到一個串對于一種轉(zhuǎn)換規(guī)則可能會有多個位置可變,而他們都是1步到達:
比如:
aacadb abcdef(原串,目標串)
a b(其中一條轉(zhuǎn)換規(guī)則)
一步就可以得到:
bacadb
abcadb
aacbdb
所以對于原串不是找到一處匹配的就變換后進行下個規(guī)則
而是繼續(xù)對于這個規(guī)則找找看一下有沒有其他地方可以匹配
so對于查詢是否有可以使用轉(zhuǎn)換規(guī)則時要用while
還有對于輸入,它規(guī)則個數(shù)是不確定的,可以用ctrl+z結(jié)束輸入,但是要記錄到底用多少條規(guī)則
*/
#include <iostream>
#include <string>
#include <queue>
#include <map>
using namespace std
;
struct rules
{string A
;string B
;int len_a
;
} data
[10];
string s
,e
;
int cnt
;
map
<string
,bool
>vis
;
map
<string
,int>step
;
int bfs()
{queue
<string
>q
;q
.push(s
);vis
[s
] = true
;while(!q
.empty()){string k
= q
.front();if(step
[k
] > 10){break;}q
.pop();if(k
== e
){return step
[k
];}for(int i
= 0; i
< cnt
; i
++){int pos
= -1;while(k
.find(data
[i
].A
,pos
+1)!=string
::npos
){pos
= k
.find(data
[i
].A
,pos
+1);if(pos
!= -1){string s1
= k
.substr(0,pos
);int t
= pos
+ data
[i
].len_a
;string s2
= k
.substr(t
,k
.length()-t
);string now
= s1
+ data
[i
].B
+ s2
;if(!vis
[now
]){vis
[now
] = true
;step
[now
] = step
[k
] + 1;q
.push(now
);}}}}}return -1;
}
int main()
{cin
>>s
>>e
;for(int i
= 0; i
< 6; i
++){cin
>>data
[i
].A
>>data
[i
].B
;data
[i
].len_a
= data
[i
].A
.length();if(data
[i
].A
== "\0")break;else cnt
++;}int ans
= bfs();if(ans
!= -1)cout
<<ans
<<endl
;elsecout
<<"NO ANSWER!"<<endl
;return 0;
}
總結(jié)
以上是生活随笔為你收集整理的P1032 字串变换(bfs)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。