题目大意
输入两堆牌str1,str2, 将两堆牌交叉重叠为一副牌str, 交叉规则是str2最底部的牌先放,然后是str1最底部的牌放在刚才放的牌的上面,直到两副牌放完。然后再从str的最底部开始到str1长度的牌直接当成str1, 从这个位置到最顶部赋给str2;直到找到和一开始输入的牌相等的str,找出要执行几次这个过程。
解题思路
这个题要用到map,利用它键值对应,以及当查找时,键所对应的值出现重复时,就说明找不到。
代码
# include <cstdio>
# include <map>
# include <string>
# include <cstring>
using namespace std;
int main(void)
{
int k, i, sum ,n,m, j;
char str[666], str1[333], str2[333], s[666];
map<string, int>num;
scanf("%d",&n);
for(k = 1; k<=n; k++)
{ num.clear();
scanf("%d",&m);
scanf("%s %s %s",str1, str2, s);
sum=0;
while(1)
{
j=0;
sum++;
for(i = 0; i<m; i++)
{
str[j++] = str2[i];//第二堆先放
str[j++] = str1[i];//后方
}
str[j]= '\0';
if(strcmp(str, s) == 0)
{
printf("%d %d\n",k, sum);
break;
}
else if(num[str])
{
printf("%d -1\n", k);
break;
}
num[str] = 1;
strncpy(str1, str, m);//底部m个为第一堆
str1[m] = '\0';
strncpy(str2, str+m, m*2);//m往上是第二堆
str2[m] = '\0';
}
}
return 0;
}