链接P1032 字串变换
感想
这个题我也是佛了,从刚开始RE#3,WA#5,到最后RE#3,花了起码两个小时,还是很简单的逻辑问题,就是find只匹配第一个字串和没有匹配的字串时要记得退出.这些在刚开始写的时候一点都没有想到,可能那时候在想的是主逻辑能够跑通就行,所以还是建议拿笔和纸,写上todo,不然等吭哧吭哧的敲完代码再想改上鲁棒操作都不好下手…(这道题到是全靠STL过的,find函数和erase,insert函数用的很开心,甚至还想用一下replace)
code
#include <algorithm>
#include <bits/stdc++.h>
#include <map>
#include <stdlib.h>
#include <stdio.h>
#include <iostream>
using namespace std;
const int maxn = 1005;
string A[50];
string B[50];
struct node
{
string a;
int ans;
node(){
ans = 0;
}
node(string aa)
{
a= aa;
ans = 0;
}
};
string exchange(string s, string a, string b, int index)
{
// cout<<s<<" "<<a<<" "<<b<<endl;
int index2 = s.find(a, index);
s.erase(index2, a.size());
s.insert(index2, b);
return s;
}
int main()
{
#ifdef LOCAL
freopen("C:\\Users\\hsxny\\Desktop\\in.txt", "r", stdin);
#endif
int i=0;
while(cin>>A[i]>>B[i])
{
i++;
}
int n=i;
string a = A[0];
string b = B[0];
queue<node> q;
map<string, int> m;
node target(a);
m[target.a] = 1;
q.push(node(a));
while(1)
{
target = q.front();
q.pop();
// cout<<target.a<<endl;
if(target.a != b && target.ans>10)
{
cout<<"NO ANSWER!"<<endl;
break;
}
if(target.a == b)
{
cout<<target.ans<<endl;
break;
}
int flag = 1;
for(int i=1;i<n;i++)
{
int index = 0;
while(target.a.find(A[i], index)!=string::npos)
{
node temp;
flag = 0;
temp.a = exchange(target.a, A[i],B[i], index);
index = target.a.find(A[i], index)+A[i].length();
if(m.count(temp.a)==1)
{
continue;
}
else
{
m[temp.a] = 1;
temp.ans = target.ans+1;
q.push(temp);
}
}
}
if(q.empty()&&target.a!=b&&target.ans>1)
{
cout<<"NO ANSWER!"<<endl;
break;
}
}
return 0;
}