字符变换

洛谷 P1032 字串变换

题目描述

已知有两个字串A,BA,B及一组字串变换的规则(至多66个规则):

A1 -> B1
​A2 -> B2

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

例如:A=‘abcd’BB=’xyz’

变换规则为:

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

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

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

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

输入输出格式

输入格式:
输入格式如下:

A B
A1 B1
A2 B2 |-> 变换规则

… … /

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

输出格式:
输出至屏幕。格式如下:

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


最短路用bfs…

#include 
#include 
#include 
using namespace std;
int n=0,ans=-1;
char c[6][25],d[6][25];
char a[40],b[40];
struct T{
    int l;
    char s[40];
}q[10000005];//按我这种方法数组要够大才行 TAT 
int find(int s,char x[],char y[])//从s开始在x中找y 
{
    int lx=strlen(x),ly=strlen(y);
    if(lx-ss;--i)
    {
    	x[i]=x[i-ly];
	}
	if(x[lx+ly]!='\0')
		x[lx+ly]='\0';
    for(int i=s;i=10)//剪枝,不剪可能出不去... 
        		break;
        	x=-1;
            l=strlen(c[i]);
            while(1)//可能含有多个 
            {
            	x=find(x+1,q[h].s,c[i]);
            	if(x==-1)
					break;
            	t++;
            	del(q[h].s,q[t].s,x,l);
            	trans(q[t].s,d[i],x);
            	q[t].l=q[h].l+1;
            	if(equal(q[t].s,b)==1)
            	{
                	ans=q[t].l;
                	return;
            	}
			}
        }
    }while(h>a>>b;
    while(cin>>c[n]>>d[n])
        n++;
    bfs();
    if(ans==-1)
        printf("NO ANSWER!\n");
    else
        printf("%d\n",ans);
    return 0;
}

你可能感兴趣的:(字符变换)