POJ 3087 Shuffle'm Up(BFS +模拟)

来源:互联网 发布:php文件怎么运行 编辑:程序博客网 时间:2024/06/05 17:38

题意:给定长度都为C两个字符串,S1,S2,和一个要求的结果字符串S12。先把 S2 的最下面一张牌放在最下面,然后S1,S2交错的叠放,得到新的S12,再把S12最下面的C个字符赋值给S1,把剩下的赋值给S2,再次重复上面的过程。最后求出要得到目标字符串S,问最少需要几步。

#include<iostream>#include<queue>#include<map>#include<cstring>#include<string>using namespace std;string s1,s2,s12;int C;int count1;string yeild1(string &s1,string &s2){    string temp;    int i;for(i=0;i<2*C;i++){if(i%2==0)temp+=s2[i/2];else temp+=s1[i/2];}return temp;}void bfs(){map<string,int>map1;queue<string>q;string temp=yeild1(s1,s2);map1[temp]++;q.push(temp);while(!q.empty()){string u=q.front();q.pop();        if(u==s12){        cout<<++count1<<" "<<map1[u]<<endl;        return ;}s1=u.substr(0,C);           //分解子串,参数一;起始位置,参数二:个数(可省略) s2=u.substr(C);string v=yeild1(s1,s2);if(!map1.count(v)){q.push(v);map1[v]=map1[u]+1;} }cout<<++count1<<" "<<-1<<endl;}int main(){int N;cin>>N;count1=0;while(N--){cin>>C;cin>>s1>>s2>>s12;bfs();}return 0;}


1 0