题意:
给定长度都为C两个字符串,S1,S2,和一个要求的结果字符串S12。先把 S2 的最下面一张牌放在最下面,然后S1,S2交错的叠放,得到新的S12,再把S12最下面的C个字符赋值给S1,把剩下的赋值给S2,再次重复上面的过程。最后求出要得到目标字符串S,问最少需要几步。
注意:
题目所给出的输入是从低向上排列的。
解析:
简单的bfs问题,直接模拟就好了。
AC代码:
#include <iostream>
#include <map>
#include <string>
#include <queue>
#include <algorithm>
using namespace std;
typedef long long ll;
map<string, int> mp;
int n;
string tar;
string trans(string s1, string s2) {
string s12 = "";
for(int i = 0; i < n; i++) {
s12 += s2[i], s12 += s1[i];
}
return s12;
}
int bfs(string s1, string s2) {
queue<string> que;
string s12 = trans(s1, s2);
mp[s12] = 1;
que.push(s12);
while(!que.empty()) {
string front = que.front();
que.pop();
if(front == tar) return mp[front];
s1 = front.substr(0, n);
s2 = front.substr(n, n);
s12 = trans(s1, s2);
if(mp[s12] > 0) return -1;
mp[s12] = mp[front] + 1;
que.push(s12);
}
return -1;
}
int main() {
//freopen("in.txt", "r", stdin);
int T, cas = 1;
string s1, s2;
cin >> T;
while(T--) {
mp.clear();
cin >> n;
cin >> s1 >> s2 >> tar;
int ans = bfs(s1, s2);
cout << cas++ << ' ' << ans << endl;
}
return 0;
}