题目大意:
有两个长度为K的字符串S1,S2,两个字符串的字符交叉放置组成新的长为2*k的字符串s3,与题目给出的S相比较,若不相同,s3的前K个字符重新组成s1,剩余的组成s2,继续循环,若最终能和S相同,输出所需步数,不可行则输出impossible.
思路:
用模拟做就行了,虽然这题放在模拟专题里,但是只有一个入口,用BFS意义不大。
#include <iostream>
#include <map>
using namespace std;
int main()
{
int ss;
cin >> ss;
for (int i = 1; i <= ss; ++i)
{
int k;
map <string,int> p;
string s1,s2,s,s3;
cin >> k;
cin >> s1 >> s2 >> s3;
s = "";
int cnt = 0;
int ok = 1;
while (1)
{
for (int j = 0; j != k; ++j)
{
s += s2[j];
s += s1[j];
}
cnt++;
if (s != s3)
if (p[s] == 0)
p[s]++;
else
{
ok = 0;
break;
}
else
break;
s1 = s.substr(0,k);
s2 = s.substr(k,k);
s = "";
}
cout << i << ' ';
if (ok)
cout << cnt << endl;
else
cout << -1 << endl;
}
return 0;
}