有s1,s2两堆颜色不一样的牌各c张,每次操作都是按照s2、s1、s2、s1….的顺序交替合成一堆共2*c张牌的s;所有s最底下一张牌是原s2的,最上面一张是原s1的,第二次操作将s的前c张牌变成新的s1,后c张变成s2;
求给定s1,s2,s,能否将s1,s2通过操作得到s,能则输出最小步数,否则输出-1;
可以模拟,可以bfs;
#include "iostream"
#include "queue"
#include "algorithm"
#include "cstring"
#include "stack"
#include "map"
using namespace std;
struct str{
string s1;
string s2;
string s;
int step;
};
int bfs(string a,string b,string c,int len) {
queue<str> q;
map<string,int> vis;
str s0;
s0.s1 = a;
s0.s2 = b;
s0.step = 0;
while(!q.empty()) q.pop();
q.push(s0);
while(!q.empty()) {
s0 = q.front();q.pop();
if(s0.s == c) {
return s0.step;
}
vis[s0.s] = 1;
str tem;
for(int i = 0; i < len; i++) {
tem.s += s0.s2[i]; //s2,s1交替放入
tem.s += s0.s1[i];
}
if(!vis[tem.s]) {
for(int i = 0; i < len; i++) tem.s1 += tem.s[i];//前c张变成s1
for(int i = len; i < 2*len; i++) tem.s2 += tem.s[i];//后c张变成s2
tem.step = s0.step+1;
vis[tem.s] = 1;
q.push(tem);
}
}
return -1;
}
int main(){
ios::sync_with_stdio(false);
string s1,s2,s;
int n,c;
cin >> n;
for(int i = 1; i <= n; i++) {
cin >> c;
cin >> s1 >> s2 >> s;
int ans = bfs(s1,s2,s,c);
cout << i << " " << ans << endl;
}
return 0;
}