P1032 字串變換(bfs)

liuliu2333發表於2018-04-28

題目描述

已知有兩個字串 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;
}

相關文章