P1032 字串變換(replace函式)
阿新 • • 發佈:2018-12-19
題目描述
已知有兩個字串 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,唯一困難的一點就是在字串的處理上……如何按照規則替換原有字元變成新的字串並放到佇列中,當然這些如果知道string的replace函式的話就不是問題……
replace(替換第i個字元開始,替換長度,替換舊字串的新字串)
順便標記字串是否用過可以用map
以下程式碼orz
#include <iostream> #include <queue> #include <map> #include <string> using namespace std; //abcd xyz //abc xu //ud y //y yz string r[110],q[110]; map <string,int> flag; struct st{ string str; int step; st(string a,int b):str(a),step(b){} }; int main() { queue <st> qe; string a,b; cin>>a>>b; int i=0,j,k; while(cin>>r[i]>>q[i]) i++; int n=i; qe.push(st(a,0)); while(!qe.empty()){ st t=qe.front(); qe.pop(); if(t.step>10){ cout<<"NO ANSWER!"<<endl; return 0; } if(b==t.str){ cout<<t.step<<endl; return 0; } for(i=0;i<n;i++){ for(j=0;j<t.str.length();j++){ if(t.str[j]==r[i][0]){ int g=j; int p=j; bool flag1=1; for(k=1,p=j+1;k<r[i].length()&&p<t.str.length();k++,p++){ if(t.str[p]!=r[i][k]){ flag1=0; break; } } if(flag1){ string h=t.str; h.replace(g,r[i].length(),q[i]); if(!flag[h]){ qe.push(st(h,t.step+1)); // cout<<h<<endl; flag[h]=1; } } } } } } cout<<"NO ANSWER!"<<endl; return 0; }