题意:重复洗牌。求出得到给定的序列所需要的步骤数。若不能得到所需序列,则输出-1.
题解:当某步得到的序列与初始序列相同时,则可以确定不可能得到给定目标序列了。
#include <iostream>
using namespace std;
char s1[101], s2[101], shuffle[201], start[201], goal[201];
int solve( int c )
{
int x, y, i, step = 0;
while ( 1 )
{
step++;
x = y = 0;
for ( i = 0; i < 2 * c; i++ )
{
if ( i % 2 == 0 )
shuffle[i] = s2[x++];
else
shuffle[i] = s1[y++];
}
shuffle[i] = '\0';
if ( strcmp(shuffle,goal) == 0 )
return step;
if ( strcmp(shuffle,start) == 0 )
return -1;
strncpy ( s1, shuffle, c );
s1[c] = '\0';
strncpy ( s2, shuffle + c, c );
s2[c] = '\0';
}
}
int main()
{
int n, c, t = 0;
scanf("%d",&n);
while ( n-- )
{
scanf("%d",&c);
scanf("%s%s%s",s1, s2, goal);
strncpy ( start, s1, c );
strncpy ( start + c, s2, c );
start[2*c] = '\0';
printf("%d %d\n", ++t, solve(c));
}
return 0;
}