本专栏持续输出数据结构题目集,欢迎订阅。
题目
甲想好了一个 n 位数字让乙来猜,只要猜的数字位数正确,至多有 1 位与谜底不同,且不同的数字相差不超过 1,就算猜对了。例如谜底是 67,若乙猜 66、68、77、57,就都算对了;猜 167 就不能算对。
输入格式:
输入首先在第一行给出一个不超过 1000 位数的、最高位不是 0 的正整数,是甲给出的谜底。随后若干行,每行给出一个乙猜的数字,都是最高位不是 0 的正整数。直到出现 -1 表示输入结束,这个数字不要做任何处理。题目保证乙至少猜了一次。
输出格式:
对每一个乙猜的数字,如果猜对了就输出 Yes,否则输出 No。
输入样例:
12345678909876
2345678909876
12345678900876
12345678809876
12345678909888
1234567890987
-1
输出样例:
No
No
Yes
No
No
题目引用自520钻石争霸赛真题(2020年)。
代码
#include <stdio.h>
#include <string.h>
#define MAX_LEN 10001
int main() {
char answer[MAX_LEN];
scanf("%s", answer);
int len = strlen(answer);
char guess[MAX_LEN];
while (scanf("%s", guess) == 1) {
if (strcmp(guess, "-1") == 0) break;
int guess_len = strlen(guess);
if (guess_len != len) {
printf("No\n");
continue;
}
int diff_count = 0;
int has_diff = 0;
for (int i = 0; i < len; i++) {
if (answer[i] != guess[i]) {
diff_count++;
if (diff_count > 1) {
has_diff = 1;
break;
}
int a = answer[i] - '0';
int g = guess[i] - '0';
if (a - g < -1 || a - g > 1) {
has_diff = 1;
break;
}
}
}
if (has_diff || diff_count > 1) {
printf("No\n");
} else {
printf("Yes\n");
}
}
return 0;
}

被折叠的 条评论
为什么被折叠?



