动不了一点 2024-03-19 19:22 采纳率: 17.2%
浏览 5

请帮我看下代码有哪里有问题,输出不对

请帮我看下这道题目我写的代码哪里有问题:
问题:
扑克桌上,扑克玩家常常会玩一种叫做“洗筹码”的游戏。洗筹码是通过将两堆扑克筹码 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;
    }


}

样例输出:

img

  • 写回答

2条回答 默认 最新

  • 码农阿豪@新空间代码工作室 Java领域优质创作者 2024-03-19 19:23
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    问题分析: 本题需要判断经过多次交错堆叠后,能否得到目标筹码组合。具体来说,我们需要模拟交错堆叠的过程,并判断最终得到的筹码组合是否为目标组合。如果是,输出交错堆叠的次数;如果不是,输出 -1。 因为每次交错堆叠是按照特定的顺序进行的,所以我们可以通过模拟这个顺序来得到最终的筹码组合。 具体的交错堆叠过程如下图所示: 可以看到,每次交错堆叠需要从 S1 和 S2 中分别取出一枚筹码,按照顺序交错堆叠。 模拟交错堆叠的过程可以采用数组进行。首先将 S1 和 S2 的筹码分别存储在数组中,然后按照交错堆叠的规则对数组进行操作。具体来说,对于数组中的第 i 个元素,如果 i 是偶数,就从 S1 取出筹码;如果 i 是奇数,就从 S2 取出筹码。 每次交错堆叠后,根据题目要求从底部取出 C 枚筹码形成新的 S1,从 S12 顶部取出 C 枚筹码形成新的 S2。我们可以将新的 S1 和 S2 存储在另外两个数组中,然后继续进行交错堆叠操作。 直到经过交错堆叠得到的筹码组合与目标筹码组合相同,或者已经超过了最大的交错堆叠次数,我们就可以停止操作,并输出结果。 解决方案: 根据上述分析,我们可以设计如下的解决方案:
    • 在主函数中读入数据集的数量 n。然后通过循环 n 次,按照题目要求读入每个数据集的输入数据,并计算最小的交错堆叠次数。
    • 对于每个数据集,首先读入初始筹码组合 S1 和 S2,然后经过一次交错堆叠操作得到 S12,接着将新的 S1 和 S2 存储在数组中,不断进行交错堆叠操作,直到得到的筹码组合与目标组合相同,或者操作次数超过了最大值。
    • 如果得到的筹码组合与目标组合相同,就输出交错堆叠操作的次数;否则输出 -1。 代码实现: 下面是本题的参考代码。这里使用了一个辅助函数 isEqual,用于判断两个数组的内容是否相同。在主函数中,我们首先读入数据集的数量 n,然后循环 n 次,每次读入输入数据并计算最小的交错堆叠次数。在计算过程中,我们使用一个计数器 sum 记录操作次数,如果操作次数超过了最大值,就停止操作。最后输出结果即可。 #include #include using namespace std; const int MAXN = 110; const int MAXM = 210; int n; //数据集数量 int c; //每堆筹码数量 char s1[MAXM], s2[MAXM], s3[MAXM]; //输入数据 char t1[MAXM], t2[MAXM]; //初始状态的两堆筹码 char a[MAXM]; //交错堆叠过程中的临时数组 //判断两个数组的内容是否相同 bool isEqual(char* a, char* b, int n) { for(int i=0; i<n; i++) if(a[i]!=b[i]) return false; return true; } int main() { //读入数据集数量 cin >> n; //循环 n 次,每次处理一个数据集 for(int k=1; k<=n; k++) { //读入输入数据 cin >> c >> s1 >> s2 >> s3; //初始化 strcpy(t1, s1); strcpy(t2, s2); int temp = c * 2; int sum = 1; bool flag = false; //模拟交错堆叠的过程,直到得到目标筹码组合或者达到最大操作次数 while(!isEqual(a, s3, temp) && sum<=100) { //取出底部 C 枚筹码形成新的 S1 int p1 = 0; for(int i=0; i<c; i++) s1[p1++] = a[i]; //取出顶部 C 枚筹码形成新的 S2 int p2 = 0; for(int i=2*c-1; i>=c; i--) s2[p2++] = a[i]; //判断是否得到了目标筹码组合 if(isEqual(t1, s1, c) && isEqual(t2, s2, c)) { flag = true; break; } //模拟下一次交错堆叠的过程 int t1=0, t2=0; for(int i=0; i<temp; i++) { if(i%2==0) a[i] = s2[t1++]; else a[i] = s1[t2++]; } sum++; } //输出结果 cout << k << " "; if(flag) cout << sum << endl; else cout << -1 << endl; } return 0; }
    评论

报告相同问题?

问题事件

  • 创建了问题 3月19日

悬赏问题

  • ¥15 (标签-android|关键词-app)
  • ¥15 微信小程序web-view嵌套H5页面IOS左滑会出现相同的页面,有什么解决方法吗?
  • ¥60 如何批量获取json的url
  • ¥15 comsol仿真压阻传感器
  • ¥15 Python线性规划函数optimize.linprog求解为整数
  • ¥15 llama3中文版微调
  • ¥15 pg数据库导入数据序列重复
  • ¥15 三分类机器学习模型可视化分析
  • ¥15 本地测试网站127.0.0.1 已拒绝连接,如何解决?(标签-ubuntu)
  • ¥50 Qt在release捕获异常并跟踪堆栈(有Demo,跑一下环境再回答)