您的位置:首页 > 其它

POJ 3087 Shuffle'm Up

2016-08-25 16:58 281 查看
模拟。

就把洗牌的过程模拟一下,开一个$map$记录一下某状态是否出现过,如果之前出现过,就意味着无解。

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<stack>
#include<iostream>
using namespace std;
typedef long long LL;
const double pi=acos(-1.0),eps=1e-8;
void File()
{
freopen("D:\\in.txt","r",stdin);
freopen("D:\\out.txt","w",stdout);
}

int T,n;
char s1[400],s2[400],t[400],s[400];

int main()
{
scanf("%d",&T); int cas=1;
while(T--)
{
scanf("%d",&n);
map<string,bool>f; memset(s,0,sizeof s); memset(t,0,sizeof t);
scanf("%s%s",s1,s2); scanf("%s",s);
int ans=0;
while(1)
{
for(int i=0;i<n;i++) t[2*i]=s2[i], t[2*i+1]=s1[i];
ans++;

if(strcmp(s,t)==0) break;

if(f[t]==0)
{
f[t]=1;
for(int i=0;i<n;i++) s1[i]=t[i];
for(int i=n;i<2*n;i++) s2[i-n]=t[i];
}
else {ans=-1; break;}
}

printf("%d %d\n",cas++,ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: