题意翻译
刽子手游戏是一款猜单词游戏,计算机想一个单词让你猜,你每次可以猜一字母 如果单词里有那个字母,所有该字母会显示出来。(例如“book”,如果猜字母“o”,则两个o都会显示出来) 如果没有那个字母,则计算机会在一幅“刽子手”画上填一 笔。这幅画一共需要7 笔就能完成,因此你最多只能错6 次。
注意,猜一个已经猜过的字母也算错。在本题中,模拟这个过程,输入单词和玩家的猜测,判断结果。
输入若干组数据,每组数据包含3行,第1行是游戏编号(-1为输入结束标记),第2行是计算机想的单词,第3行是玩家的猜测。后两行保证只含小写字母。
输出每组对应两行,第一行为游戏编号,格式为“Round 局数”(无引号,中间有空格),第二行为游戏结果,如果玩家获胜,输出"You win.",如果玩家失败,输出"You lose.",如果参赛者没有猜到足够的字母就退出,输出"You chickened out."(句末有句点,无引号)
输入输出样例
输入 #1
1
cheese
chese
2
cheese
abcdefg
3
cheese
abcdefgij
-1
输出 #1
Round 1
You win.
Round 2
You chickened out.
Round 3
You lose.
思路
题目有三种输出,一种是在猜完之前,猜到了所有字母,一种是猜完后,没有猜到所有字母,也没有猜错7次,一种是猜错7次.
思路很简单,设置一个数组,记录出现了哪些字母,设置两个变量,一个用来记录猜错几次,一个用来记录出现多少字母.
代码
#include <stdio.h>
#include <string.h>
int vaild[26];
int main() {
int n;
int right = 0;
int fault = 0;
int flag = 0;
while (1) {
scanf("%d", &n);
// 结束条件
if (n == -1) {
return 0;
}
// 注意变量也要初始化
right = 0;
fault = 0;
flag = 0;
// 注意初始化
memset(vaild, 0, sizeof(vaild));
getchar();
char c;
while ((c = getchar()) != '\n') {
if (vaild[c - 'a'] == 0) {
// 完成vaild和right的记录
vaild[c - 'a']++;
right++;
}
}
char t;
while ((t = getchar()) != '\n') {
if (vaild[t - 'a'] == 0) {
fault++;
} else {
right--;
vaild[t - 'a'] = 0;
}
if (right <= 0) {
flag = 1;
char m;
/* 因为使用的是getchar,如果在还没有读取完的时候就退出循环,会影响其他的getchar函数的读取,这里把输入吸收完*/
while ((m = getchar()) != '\n');
break;
} else if (fault >= 7) {
flag = -1;
char x;
while ((x = getchar()) != '\n');
break;
}
}
printf("Round %d\n", n);
if (flag == 1) {
printf("You win.\n");
} else if (flag == 0) {
printf("You chickened out.\n");
} else {
printf("You lose.\n");
}
}
return 0;
}