请帮我看下这道题目我写的代码哪里有问题:
问题:
扑克桌上,扑克玩家常常会玩一种叫做“洗筹码”的游戏。洗筹码是通过将两堆扑克筹码 S1 和 S2 进行交错堆叠来完成的,每堆筹码包含 C 个筹码。每堆筹码可能包含多种不同颜色的筹码。
实际的洗牌操作是通过将 S1 中的一枚筹码与 S2 中的一枚筹码交错堆叠来完成的,如下所示,当 C = 5 时:
得到的单一结果堆 S12 包含 2 * C 个筹码。 S12 的底部筹码是来自 S2 的底部筹码。在这枚筹码上面,是来自 S1 的底部筹码。交错堆叠过程继续,将来自 S2 底部第二枚筹码放在 S12 上,然后是来自 S1 底部第二枚筹码,以此类推,直到将来自 S1 的顶部筹码放在 S12 上。
洗牌操作后,S12 被分成两堆新的筹码,从 S12 底部取出 C 枚筹码形成新的 S1,从 S12 顶部取出 C 枚筹码形成新的 S2。然后可以重复洗牌操作形成新的 S12。
对于这个问题,你需要编写一个程序来确定特定的结果堆 S12 是否可以通过多次洗牌操作形成。
输入
输入的第一行包含一个整数 N,(1 ≤ N ≤ 1000),表示接下来的数据集的数量。
每个数据集包括四行输入。数据集的第一行指定一个整数 C,(1 ≤ C ≤ 100),表示每堆初始筹码(S1 和 S2)中的筹码数量。每个数据集的第二行指定 S1 中每个 C 枚筹码的颜色,从底部筹码开始。每个数据集的第三行指定 S2 中每个 C 枚筹码的颜色,从底部筹码开始。颜色用单个大写字母表示(A 到 H)。筹码颜色之间没有空格或分隔符。每个数据集的第四行包含 2 * C 个大写字母(A 到 H),表示 S1 和 S2 洗牌零次或多次后所期望的结果颜色。底部筹码的颜色首先被指定。
输出
每个数据集的输出包括一行,显示数据集编号(从 1 到 N),一个空格,以及一个整数值,表示获得期望结果堆所需的最小洗牌次数。如果使用数据集中的输入无法获得期望结果,则显示值 -1 作为洗牌次数。
代码:
#include "iostream"
#include "cstring"
using namespace std;
int n, c, sum, count1, c1;
char a[300], s1[300], s2[300], s3[300];
char t1[300], t2[300];
int temp1, temp2;
int main() {
cin >> n;
while (n--) {
c1 = 0;
temp1 = temp2 = 0;
sum = 1;
cin >> c;
cin >> s1 >> s2 >> s3;
strcpy(t1, s1);
strcpy(t2, s2);
int temp = c * 2;
for (int i = 0; i < temp; i++) {
if (i % 2 == 0)
a[i] = s2[temp1++];
else a[i] = s1[temp2++];
}
while (strcmp(a, s3) != 0&&!c1) {
temp1 = temp2 = 0;
sum++;
for (int i = 0; i < c; i++)
s1[temp1++] = a[i];
for (int i = 2 * c - 1; i >= c; i--)
s2[temp2++] = a[i];
temp1 = temp2 = 0;
if (strcmp(t1, s1) == 0 && strcmp(t2, s2) == 0)
{
c1 = 1;
}
for (int i = 0; i < temp; i++) {
if (i % 2 == 0)
a[i] = s2[temp1++];
else a[i] = s1[temp2++];
}
}
if (c1 == 1) {
cout << ++count1 << ' ' << -1 << endl;
}
else cout << ++count1 << ' ' << sum << endl;
}
}
样例输出: