已知有兩個字串 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輸出樣例#1:abc xu
ud y
y yz
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所需的最小的轉換次...