C语言代码错误排查:公园猫狗喂食测试用例误判
公园猫狗喂食算法问题排查
问题需求
准备D份狗粮、C份猫粮,N只动物按队列等待,字符串S表示动物顺序(C为猫,D为狗)。喂食规则:
- 按队列顺序喂食,每只狗吃1份狗粮,每只猫吃1份猫粮;
- 每喂一只狗,额外获得M份猫粮;
- 若当前动物对应食物耗尽,队列停止前进;
- 需判断所有狗是否都能被喂食。
输入格式
- 第一行输入测试用例数T;
- 每个测试用例第一行输入整数N、D、C、M;
- 第二行输入字符串S。
示例输入
2 12 4 2 2 CDCCCDCCDCDC 8 2 1 3 DCCCCCDC
预期输出
Case #1: YES Case #2: NO
我的问题
我编写的C代码运行后两个测试用例均输出YES,与预期不符。
我的代码
#include <stdio.h> int main(int argc, char *argv[]) { int T, N, D, C, M; char s[1000001]; scanf("%d", &T); for (int i = 1; i <= T; ++i) { scanf("%d %d %d %d %s", &N, &D, &C, &M, s); int Dogs = 0; int Cats = 0; int DogsFed = 0; int CatsFed = 0; for (int j = 0; j < N; j++) { if (s[j] == 'D') { Dogs++; } if (s[j] == 'C') { Cats++; } } while (C > 0 && (D > DogsFed || (D == DogsFed && s[N-1] == 'D'))) { for (int z = 0; z < N; z++) { if ((s[z] == 'D') && (D > 0)) { DogsFed++; D--; if (M > 0) { C += M; } } else if ((s[z] == 'C') && (C >= (Cats-CatsFed))) { CatsFed++; C--; } } } if (DogsFed == Dogs) { printf("Case #%d: YES\n", i); } else { printf("Case #%d: NO\n", i); } } return 0; }
代码问题分析
你的代码逻辑完全偏离题目规则,核心错误点如下:
- 循环逻辑错误:用外层while嵌套内层for反复遍历整个队列,不符合题目“按队列顺序前进,遇到食物耗尽立即停止”的要求。题目要求逐个处理动物,遇到无法喂食的就终止流程,而非反复从头遍历。
- 猫的喂食条件错误:判断
C >= (Cats-CatsFed)才喂猫完全不合理,正确逻辑是轮到这只猫时,只要当前还有猫粮(C > 0)就可以喂食,无需考虑剩余所有猫的需求。 - 未正确处理停止条件:处理到某只动物时,若对应食物耗尽,没有立即终止整个喂食流程,导致后续错误的喂食操作。
修正思路
正确做法是按队列顺序逐个处理每只动物:
- 遍历字符串S的每个字符,依次处理每只动物;
- 遇到狗:
- 若D>0,喂食它(D--,fed_dogs++),并增加M份猫粮(C+=M);
- 若D=0,直接停止遍历;
- 遇到猫:
- 若C>0,喂食它(C--);
- 若C=0,直接停止遍历;
- 遍历结束后,判断fed_dogs是否等于总狗数。
修正后的参考代码
#include <stdio.h> int main() { int T; scanf("%d", &T); for (int case_num = 1; case_num <= T; case_num++) { int N, D, C, M; char s[1000001]; scanf("%d %d %d %d %s", &N, &D, &C, &M, s); int total_dogs = 0; for (int i = 0; i < N; i++) { if (s[i] == 'D') total_dogs++; } int fed_dogs = 0; int stop = 0; for (int i = 0; i < N; i++) { if (stop) break; if (s[i] == 'D') { if (D > 0) { D--; fed_dogs++; C += M; } else { stop = 1; } } else { if (C > 0) { C--; } else { stop = 1; } } } printf("Case #%d: %s\n", case_num, fed_dogs == total_dogs ? "YES" : "NO"); } return 0; }
内容的提问来源于stack exchange,提问作者Fab
相关产品推荐
相关产品推荐

