题目链接 : 戳我
好歹也是2002年NOIP全国联赛提高组,开始不知道string黑科技,打起来恶心的要死……后来知道了黑科技,打起来真是快,T起来也真是快,不过对于当年数据还是可以的。
题目一看,好难,再看数据范围,暴力能过,于是就想打暴力吧,但是由于字符串比较恶心,自己对字符串处理不太擅长,于是就打了一半放弃治疗,看了题解(我当时打了70行题解39行)……
暴力思想就是:对于一个串,暴力枚举字符串的每一位,对于每一位枚举字符串,看看是否可以匹配,如果可以匹配,那就把这个状态加入队列,now.step = f.step + 1,如果到达目标状态就输出,如果大于10步,输出NO ANSWER!.
string黑科技在代码中有讲…………黑科技部分2333;
#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 ++)
/*
string类型黑科技:
compare(从该位置开始,比较的长度,要比较的s)
replace(从该位置开始,替换中原串长度,替换串s)
*/
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;
}