時間限制:1 s 記憶體限制:128 mb
已知有兩個字串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
3
正解就是搜,深蒐會超時,可以考慮廣搜,即雙向廣搜,可以防止被卡資料,比如正向搜過慢,而反向搜很快的點。
先貼一發我dfs+神剪枝+卡資料的搜
#include#include#include#include#include#include#includeusing namespace std;string a,b,a[10],b[10];
int n=1,ans=11,cnt=0;
mapmp;
void dfs(string x,int len)
//深搜次數過多直接輸出無解,卡資料。
if(len>10||x.size()>20||len>ans)return;
if(x==b)
string f=x;int k;
for(int i=1;i<=n;i++);
queueq1,
q2;map<
string
,int
>m1,
m2;string changings[6
][2];int
cnt,
ans;
string become
(string now
,int
pos,
intn
,string tmp
)bool
dbfs()}
}s1=q2
.front
(),s2;q2
.pop
();len=s1
.s.size
();for
(inti=
0;i<
len;
i++)
for(
intj=0
;j<
cnt;
j++)}}
}return0;
}int
haha()a
.num=b
.num=0
;q1.push(a
);q2
.push(b
);while
(cin
>>
changings
[cnt][0
]>>
changings
[cnt][1
])cnt
++;m1[a
.s]=0
;m2[b
.s]=0
;if(dbfs
())cout
<<
ans;
else
puts
("no answer!");}
intsb
=haha
();int
main
()
字串變換
現有乙個字典,同時給定字典中的兩個字串s和t,給定乙個變換,每次可以改變字串中的任意乙個字元,請設計乙個演算法,計算由s變換到t所需的最少步數,同時需要滿足在變換過程中的每個串都是字典中的串。給定乙個string陣列dic,同時給定陣列大小n,串s和串t,請返回由s到t變換所需的最少步數。若無法變換...
字串變換
字串變換 相信經過這個學期的程式設計訓練,大家對於字串的操作已經掌握的相當熟練了。今天,徐老師想測試一下大家對於字串操作的掌握情況。徐老師自己定義了1,2,3,4,5這5個引數分別指代不同的5種字串操作,你需要根據傳入的引數,按照徐老師的規定,對輸入字串進行格式轉化。徐老師指定的操作如下 1.表示全...
DP 字串變換
給定兩個字串,已知可以使用三種方式進行變換 1.插入乙個字元 2.刪除乙個字元 3.更改乙個字元 請設計乙個演算法,找到兩個字串之間的經歷幾次最小變換,可以字串1轉換成字串2 輸入描述 輸入兩個字串,字串的長度 1000輸出描述 最小變換次數示例1 hello helle1 include usin...