洛谷1032 字串變換

2021-07-07 05:16:47 字數 2409 閱讀 1274

已知有兩個字串 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!"

輸入樣例#1:

abcd xyz

abc xu

ud y

y yz

輸出樣例#1:

3
————————————————————————————————————————————

//雙向bfs。 

#include#includechar a[100000][21]=},b[100000][21]=};

int main(void)

},right[1001][21]=};//記錄變換規則

int i,j,lenc=0,lenl=0,lenr=0,step=0;

scanf("%s%s",a[0],b[0]);//記錄起點與終點,雙向bfs

while(scanf("%s%s",left[lenl++],right[lenr++])==2) lenc++;//lenc:變換規則的數量

int h1=0,t1=1,h2=0,t2=1; //h為頭,t為尾。

int delta=0,k=1,count1=0,count2=0;//k記錄頭結點個數,count記錄頭結點擴充套件出結點的數量

char *ptr;//delta記錄搜尋到的字串位址,ptr為函式返回值。

while(h1=0); //判斷找到與否

}h1++;//擴充套件下乙個頭結點

} k=count2;count2=0;step++;//k記錄頭結點個數。

if(h2==0)k=1;

//下面部分複製上面的,把a改b,把left改right之類即可。

while(k--)

h2++;

} k=count1;count1=0;step++;

} printf("no answer!");

return 0;

}

看題解前用了沒想過雙向bfs,於是下面是單向版本

//單向bfs60分  

#include#includechar a[1000000][21]=};

int main(void)

},right[1001][21]=},target[21];//記錄變換規則

int i,lenc=0,lenl=0,lenr=0,step=0;

scanf("%s%s",a[0],target);//記錄起點與終點,雙向bfs

while(scanf("%s%s",left[lenl++],right[lenr++])==2) lenc++;//lenc:變換規則的數量

int h1=0,t1=1; //h為頭,t為尾。

int delta=0,k,count1=1;//k記錄頭結點個數,count記錄頭結點擴充套件出結點的數量

char *ptr;//delta記錄搜尋到的字串位址,ptr為函式返回值。

while(h1 < t1 && step++ < 10)

h1++;//擴充套件下乙個頭結點

}

} printf("no answer!");

return 0;

}

順便來個簡單易寫的dfs

//直接深搜40分

#include#include#includechar a[21]=;int min=10;

char left[1001][21]=},right[1001][21]=},target[21]=;//記錄變換規則

int lenc=0,lenl=0,lenr=0;

void dfs(char *a,int step)

for(i=0;i

洛谷 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 其變換的過程為...

洛谷P1032字串變換

題目描述 已知有兩個字串a,b a,b 及一組字串變換的規則 至多6個規則 a1 b1 a 1 b1 a2 b2 a 2 b2 規則的含義為 在a的子串中a1 a 1可以變成b1 b 1,a2 a 2可以變成b2 b 2 求a a 變成b role presentation b b所需的最小的轉換次...