1. 程式人生 > >洛谷 P1032 字串變換 (BFS)

洛谷 P1032 字串變換 (BFS)

ref bfs repl sin org mes UC show 處理

題目傳送門

我即使是死了,釘在棺材裏了,也要在墓裏,用這腐朽的聲帶喊出

STL大法好

這題最麻煩的其實是處理字符串,真正的搜索部分我個人認為也就只有橙題或黃題的難度。而處理字符串,正如前面所說,STL大法好!雖然也有好多人用了STL,但我個人認為我的更精巧一些(各位dalao不要打我 ~(>_<。)\ )

用STL實現替換是這樣的:

string repl(int be,string x,string y,string z) //將字符串x從be位置開始的第一個子串y替換成z,如果子串y不被x包含,則返回x
{
    int pos=x.find(y,be); //尋找子串y在x中的位置,如果不存在,返回-1
if(pos>=0) //如果y存在,則進行替換操作 x=x.replace(pos,y.size(),z); //將x在pos位置的長度為y.size的串(也就是y)替換成z return x; //返回更改後的字符串 }

用STL實現的判重是這樣的:

map <string,bool> vis;

這樣再進行廣搜尋找最優解就方便得多了。由於廣搜實現起來很簡單,就不單獨解釋了,直接上完整代碼。

#include<iostream>
#include<cstdio>
#include<map>
using namespace
std; struct yyy{ string f, t; }rule[10]; //存變換規則 struct hhh{ string now; int st; }q[10001]; //模擬隊列,now是當前的字串,st是步數 int h=1,t; map<string,bool> vis; //map查重 string repl(int be,string x,string y,string z) //替換子串,前面已經講過了 { int pos=x.find(y,be); if(pos>=0) x=x.replace(pos,y.size(),z); return
x; } int main() { //輸入 string a,b; int n=0; cin>>a>>b; while(cin>>rule[++n].f&&cin>>rule[n].t) //搜索 q[++t].now=a; vis[a]=1; while(h<=t) { for(int i=1;i<=n;i++) { for(int j=0;j<q[h].now.size();j++) { string x=repl(j,q[h].now,rule[i].f,rule[i].t); if(x==b) { cout<<q[h].st+1; return 0; } if(!vis[x]&&q[h].st+1<=10) { vis[x]=1; q[++t].now=x; q[t].st=q[h].st+1; } } } h++; } cout<<"NO ANSWER!"; return 0; }

洛谷 P1032 字串變換 (BFS)