1. 程式人生 > >【P3411】字串變換

【P3411】字串變換

題解:普通的 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;
}