【洛谷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;
}
posted @ 2018-11-30 22:37  shellpicker  阅读(161)  评论(0编辑  收藏  举报