字串变换
作者:互联网
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