大暴搜 字串變換

2021-08-05 21:44:22 字數 1919 閱讀 4773

時間限制: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 xyz

abc 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...