已知有两个字串 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 。
输入描述 Input Description 输入格式如下:
A B A1
B1 \ A2 B2 |-> 变换规则 … … / 所有字符串长度的上限为
20。输出描述 Output Description 若在 10 步(包含 10步)以内能将 A 变换为B
,则输出最少的变换步数;否则输出”NO ANSWER!”样例输入 Sample Input
abcd xyz
abc xu
ud y
y yz样例输出 Sample Output
3数据范围及提示 Data Size & Hint hehe
string大法好QAQ STL大法好QAQ
string大法好QAQ STL大法好QAQ
string大法好QAQ STL大法好QAQ
重说三。。
首先这里我不太会处理字符串 搜索掌握的也不是很好 但是我们是c++选手呀QwQ
这里介绍一下 string库里的两个小(hei)函(ke)数(ji):
1.compare 2.replace 顾名思义 他们分别是比较和替换
定义一个字符串叫做S
S.compare(从该位置开始,比较的长度,要比较的s) 如果S 与 s 完全匹配 返回值为1 否则返回0
S.replace(从该位置开始,替换的原串长度,替换串s) 在循环中找到可以变换的部分之后进行替换
题解:
开一个结构体,并利用队列记录一下替换次数和A$串的字符 如果匹配不成功 我们就在变换规则中找到替换规则并进行replace 将新串入队 直到将两个串遍历结束 如果完全匹配且变化次数小于10 输出答案 否则输出”NO ANSWER”
代码:
/*
string类型黑科技:
compare(从该位置开始,比较的长度,要比较的s)
replace(从该位置开始,替换中原串长度,替换串s)
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
string st,en,a[8],b[8];
struct poi{string s;int step;};
int tot = 1;
queue <poi> q;
void bfs()
{
q.push((poi){st,0});
while(!q.empty() && q.front().step < 10)
{
poi f = q.front();
q.pop();
for(int i = 1;i < tot;i ++)
for(int k = 0;k < f.s.length();k ++)
if(f.s.compare(k,a[i].size(),a[i]) == 0) //成功匹配返回0
{
string tmp = f.s;
tmp.replace(k,a[i].size(),b[i]); //string自带的反转
if(tmp == en)
{
cout<<f.step+1;
return ;
}
q.push((poi){tmp,f.step+1});
}
}
cout<<"NO ANSWER!";
}
int main()
{
cin>>st>>en;
while(cin>>a[tot]>>b[tot]) tot++;
bfs();
return 0;
}
小结:
1.STL确实好用 但string比较慢 最后一个点卡空间和时间过
2.NOIP不到四十天了 好好练码力 查缺补漏 提升实力 加油!
3.再用搜索把这个题打出来 再回来填个坑