其他分享
首页 > 其他分享> > 字串变换

字串变换

作者:互联网

4783: 字串变换

时间限制(普通/Java):1000MS/3000MS     内存限制:65536KByte

描述

已知有两个字串 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!"

样例输入

abcd xyz
abc xu
ud y
y yz

样例输出

3

广搜,模板稍微改一改就能过:入队时查重,防止同种情况重复入队浪费时间;

记录变换规则时不能用Map存,可能存在多个规则,同一个字符串有多种转换规则

例如 xxxx yyyy

  x y

  x z

后者会覆盖前个规则(当时没考虑到这点,卡了挺久)

直接用两个string数组存就好,然后定义一个int变量记录有几条规则

代码

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int n;
 4 class Node
 5 {
 6 public:
 7     string s;
 8     int ci;
 9 };
10 int sum=0;
11 string zuo[8],you[8];
12 queue<Node>q;
13 map<string,int>Map;//用于查重
14 int main() 
15 {
16     ios_base::sync_with_stdio(false);
17     cin.tie(nullptr);
18     cout.tie(nullptr);
19     string be,en;
20     cin>>be>>en;
21     string s,t;
22     while(cin>>s>>t)
23     {
24 
25         zuo[sum]=s;
26         you[sum]=t;
27         sum++;
28     }
29     q.push({be,0});
30     while(!q.empty())
31     {
32         Node temp=q.front();
33         q.pop();
34         if(temp.s.compare(en)==0)
35         {
36             cout<<temp.ci<<endl;
37             return 0;
38         }
39         int len=temp.s.length();
40         for(int i=0;i<len;i++)
41         {
42             for(int j=0;j<sum;j++)
43             {
44                 if(temp.s.substr(i,zuo[j].length()).compare(zuo[j])==0)
45                 {
46                     string tem=temp.s.substr(0,i)+you[j]+temp.s.substr(i+zuo[j].length()); //获取转换后的字符串
47                     if(temp.ci<10&&Map[tem]!=1)//符合条件并未搜过的情况入队
48                     {
49                         q.push({tem,temp.ci+1});
50                         Map[tem]=1;
51                     }
52                 }
53             }
54         }
55     }
56     cout<<"NO ANSWER!"<<endl;
57     return 0;
58 }

 

标签:string,变换,sum,int,字串,规则
来源: https://www.cnblogs.com/minz-io/p/16514070.html