P1032 字串变换(bfs)

题目描述

已知有两个字串 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 BA1 B1 \

A2 B2 |-> 变换规则

... ... /

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

输出格式:

输出至屏幕。格式如下:

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

输入输出样例

abcd xyz
abc xu
ud y
y yz
输出
3
又学一招string....

#include<bits/stdc++.h>
using namespace std;
string a,b;
string c[10],d[10];
struct nomd
{
	string s;
	int step;
};
int main()
{
	cin>>a>>b;
	int n=1;
	while(cin>>c[n]>>d[n])
	{
		n++;
	}
	n--;
	nomd e;e.s=a;e.step=0;
	queue<nomd>que;
	que.push(e);
	map<string,int> w;
	while(que.size())
	{
		nomd t=que.front();
		que.pop();
		if(t.step>10)
		{
			printf("NO ANSWER!");
			return 0;
		}
		else if(t.s==b&&t.step<=10)
		{
			printf("%d\n",t.step);
			return 0;
		}
		if(w[t.s]==0)
		{
			w[t.s]=1;
			for(int i=1;i<=n;i++)
			{
				if(t.s.find(c[i])>=0)
				{
					for(int j=t.s.find(c[i]);j>=0&&j<=t.s.size()-c[i].size();j=t.s.find(c[i],j+1))
					{
						nomd z=t;
						z.step+=1;
						z.s=z.s.replace(j,c[i].size(),d[i]);
						que.push(z);
					}
				}
			}
		}
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值