題意:給定s1,s1兩副撲克,順序從下到上。依次將s2,s1的撲克一張一張混合。例如s1,ABC; s2,DEF. 則第一次混合後為DAEBFC. 然後令前半段為s1, 後半段為s2. 如果可以變換成所給出的字符串,輸出變換次數即可;否則,輸出-1。
這題數據太水了,我是這樣判斷無法變換成題目所給出的字符串的:將每一次變換後的字符串存進數組,每次變換後由於之前變換後的字符串相比較,如果有相同的,就說明會無限循環下去。這樣一來,循環次數會增加很多,然而0ms過了。。。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char ss[1000][200];
int main()
{
//freopen("in.txt","r",stdin);
int n;
scanf("%d",&n);
int t=1;
while(n--)
{
int m;
bool flag=false;
char s1[200],s2[200],s[400];
memset(s1,0,sizeof(s1));
memset(s2,0,sizeof(s2));
memset(s,0,sizeof(s));
memset(ss,0,sizeof(ss));
scanf("%d%s%s%s",&m,s1,s2,s);
for(int i=0;; i++)
{
for(int j=0; j<m; j++)
ss[i][2*j]=s2[j];
for(int j=0; j<m; j++)
ss[i][2*j+1]=s1[j];
if(strcmp(s,ss[i])==0)
{
printf("%d %d\n",t,i+1);
break;
}
else
{
for(int j=0; j<i; j++)
if(strcmp(ss[i],ss[j])==0)
{
printf("%d -1\n",t);
flag=true;
break;
}
if(flag)
break;
}
for(int j=0; j<m; j++)
{
s1[j]=ss[i][j];
s2[j]=ss[i][j+m];
}
}
t++;
}
return 0;
}