普及练习场-广度优先搜索-P1032 字串变换

烂漫一生 提交于 2020-02-27 13:11:05

题目描述
已知有两个字串 A, B 及一组字串变换的规则(至多6个规则):

A1 -> B1

A2 -> B2

规则的含义为:在 A$中的子串 A1 可以变换为 B1、A2 可以变换为 B2 …。

例如:A=’abcd’B=’xyz’

变换规则为:

‘abc’->‘xu’‘ud’->‘y’‘y’->‘yz’

则此时,A 可以经过一系列的变换变为 B,其变换的过程为:

‘abcd’->‘xud’->‘xy’->‘xyz’

共进行了三次变换,使得 A 变换为B。

输入输出格式
输入格式:

输入格式如下:

A B A1 B1 \

A2 B2 |-> 变换规则

… … /

所有字符串长度的上限为 20。

输出格式:

输出至屏幕。格式如下:

若在 10 步(包含 10步)以内能将 A 变换为 B ,则输出最少的变换步数;否则输出"NO ANSWER!"

输入输出样例
输入样例#1:

abcd xyz
abc xu
ud y
y yz

输出样例#1:

3
————————————————
思路:BFS+map 函数 来做

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<map>
#include<queue>


using namespace std;
map < string,int > mp;
int main(){
	string a,b;
	cin>> a >>b;
	string x[10],y[10];
	int n=1;
	while(cin>>x[n]>>y[n]){
		n++;
	}
	n--;
	queue<string> Q;
	queue<int> s;
	
	Q.push(a);
	s.push(0);
	while(!Q.empty()){
		if(Q.front() == b){
			cout<<s.front();
			return 0;
		}
	
	if(s.front() == 10){
		Q.pop();
		s.pop();
	}
	string t = Q.front();
	
	if(mp.count(t)){//判断是否存在t
		Q.pop();
		s.pop();
		continue;
	}
	mp[t]=1;
	for(int i=1;i<=n;i++)
	{
		int p=0;
		while(t.find(x[i],p)!=-1){
			p=t.find(x[i],p);
			Q.push(t.substr(0,p) + y[i] + t.substr(p+x[i].length()));
			s.push(s.front()+1);
			p++;
		}
		
	}
	Q.pop();
	s.pop();
}
cout<<"NO ANSWER!";
	return 0;
} 
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!