【P3411】字串變換
阿新 • • 發佈:2018-11-30
題解:普通的 BFS 沒什麼可說的,字串處理是這道題的難點,同時需要注意雜湊判重。
另外,對於 \(string\) 類來說,學到了一個 push_back((char)) 操作。
c++string類詳解
程式碼如下
#include <bits/stdc++.h> using namespace std; int n; string from[6],to[6],st,ed; map<string,bool> mp; struct node{string s;int cnt;}; void read_and_parse(){ cin>>st>>ed; while(cin>>from[n]>>to[n])n++; } string work(const string& s,int idx,int t){ if(idx+from[t].size()>s.size())return ""; for(int i=0;i<from[t].size();i++)if(from[t][i]!=s[i+idx])return ""; string now=""; for(int i=0;i<idx;i++)now.push_back(s[i]); now+=to[t]; for(int i=idx+from[t].size();i<s.size();i++)now.push_back(s[i]); return now; } void solve(){ queue<node> q; q.push(node{st,0}); while(q.size()){ node u=q.front();q.pop(); if(mp.find(u.s)!=mp.end())continue; if(u.cnt>10){puts("NO ANSWER!");return;} if(u.s==ed){printf("%d\n",u.cnt);return;} mp[u.s]=1; for(int i=0;i<u.s.size();i++) for(int j=0;j<n;j++){ string now=work(u.s,i,j); if(now=="")continue; q.push(node{now,u.cnt+1}); } } puts("NO ANSWER!"); } int main(){ read_and_parse(); solve(); return 0; }