今天队友做搜索专题的时候,碰到了一道模拟题。于是果断丢给我了。
开始看了题目还以为要用到stack,结果发现并不需要用到栈,只要用string类直接模拟就可以了。
大致说一下思路,就是用两堆牌来洗牌,看什么时候能洗到题目所给的情况,为了判断能否洗到所给情况,需要用map来记录一下已经出现过的情况。
如果没有出现题目所给的情况,但是已经出现了之前出现过的情况,说明洗牌已经成了一个环,始终无法洗到所给情况,这时候直接输出-1即可,否则每一次都要把洗完的牌,最下边的给s1,最上边的给s2。
用字符串数组和string类都可以,用string类要注意不能用角标替换,因为对string类不是很熟练,所以今天用了string类来做。
代码:
#include <cstdio>
#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
#include <map>
using namespace std;
int main()
{
int T,c,i,count,cas=1;
cin>>T;
while(T--)
{
count=1;
cin>>c;
string s1,s2,s;
cin>>s1>>s2>>s; //输入两堆牌以及需要找到的情况
map<string,bool> m; //用来记录是否已经出现过
m[s]=true;
cout<<cas++<<' ';
while(true)
{
string sh; //创建一个string类专门存每一次洗牌后的结果
string ss1,ss2; //两个string类来记录洗牌后两堆牌的情况
for(i=0;i<c;i++)
{
sh+=s2[i];
sh+=s1[i];
}
if(!sh.find(s)) //找到所给情况输出
{
cout<<count<<endl;
break;
}
else if(sh.find(s)&&m[sh]) //未找到所给情况并且已经出现重复情况
{
cout<<-1<<endl;
break;
}
m[sh]=true; //未出现的情况记录下来
count++;
for(i=0;i<c;i++)
ss1+=sh[i];
for(i=c;i<c*2;i++)
ss2+=sh[i];
s1=ss1;
s2=ss2;
}
}
return 0;
}