题意:给出洗牌的方式,问几次能洗出要求的牌。
洗牌方式就是插入,很简单。
用map<string,int >visit 记录是否出现过。
值得学习的就是这种想法,用map记录判断是否能洗出这种牌。
#include<iostream>
#include<cstring>
#include<map>
using namespace std;
int main()
{
int t = 0,text;
cin>>text;
while(++t <= text){
int n;
cin>>n;
char s1[205],s2[205],s12[410];
cin>>s1>>s2>>s12;
map<string,int>visit;
visit[s12] = true;
int step = 0;
while(true){
char s[410];
int all = 0;
for(int i = 0;i < n; i++){
s[all++] = s2[i];
s[all++] = s1[i];
}
s[all] = '\0';
step++;
if(!strcmp(s,s12)){
cout<<t<<" "<<step<<endl;
break;
}
else if(visit[s] && strcmp(s,s12)){
cout<<t<<" "<<"-1"<<endl;
break;
}
visit[s] = true;
for(int i = 0;i < n; i++){
s1[i] = s[i];
}
s1[n] = '\0';
for(int k = n,i = 0;k < 2*n; k++,i++){
s2[i] = s[k];
}
s2[2*n] = '\0';
}
}
return 0;
}