POJ

题意:将两个字符串模拟洗牌的操作合并问是否能得打答案,以及中间经过的次数,如果不能则输出-1

思路:这是一道模拟题,所以只需要写一个模拟操作,不断循环即可。同时还要判断循环结束条件(递归结束条件),如果自己手写一个例子的话就会发现其在不超过2*n(n为长度)次数就会洗回来

完整代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
using namespace std;
const int maxn = 1e3;
string s1,s2,s12;
int n;
void dfs(int step, string s){
    if(!s.compare(s12)){
        cout<<step<<endl;
        return ;
    }else if(step>(2*n)){
        cout<<-1<<endl;
        return ;
    }
    s.clear();
    for(int i=0;i<n;i++){
        s.push_back(s2[i]);
        s.push_back(s1[i]);
    }
    s1.assign(s,0,n);
    s2.assign(s,n,n);
    dfs(++step,s);
}
int main(){
    int T;
    cin>>T;
    int cnt =0;
    while(T--){
        cin>>n;
        cin>>s1>>s2>>s12;
        cout<<++cnt<<" ";
        dfs(0,s2);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/Tianwell/p/11259069.html