题目链接:http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=1296
题意: 给出一些个替换模式, 问将原始串通过替换得到目标串所需要的最小的替换次数是多少。
思路:由于数据规模很小(n<=10),并且每次替换的时候都将都将所有能替换的都替换,并且再有多种位置可发生替换的时候,优先替换最左边的串,这些个条件使得题目的不确定度大大的降低,直接使用bfs搜索就好。
通过这道题,熟悉一下string还有map的使用还是很不错的。
code:
#include <cstdio> #include <cstdlib> #include <iostream> #include <algorithm> #include <cstring> #include <map> #include <queue> #include <string> using namespace std; map<string,int> pam; queue<string> que; int n; string s0[20],s1[20]; string org,aim; int bfs() { pam.clear(); pam[org]=0; que.push(org); while(que.size()){ string v=que.front(); que.pop(); if(v.length()>aim.length()) continue; for(int i=0;i<n;i++){ int l1=s0[i].length(),l2=v.length(); string u=""; for(int j=0;j<l2;j++){ if(j+l1-1<l2&&v.substr(j,l1)==s0[i]){ u+=s1[i]; j=j+l1-1; } else u+=v[j]; } //cout<<"org="<<v<<" t0="<<s0[i]<<" t1="<<s1[i]<<" res="<<u<<endl; if(!pam.count(u)||pam[u]>pam[v]+1){ pam[u]=pam[v]+1; que.push(u); } } } if(!pam.count(aim)) return -1; else return pam[aim]; } int main() { while(cin>>n,n!=0){ for(int i=0;i<n;i++) cin>>s0[i]>>s1[i]; cin>>org; cin>>aim; cout<<bfs()<<endl; } return 0; }
时间: 2024-10-07 17:14:24