UVA489 刽子手的游戏 Hangman Judge 题解

题意翻译

刽子手游戏是一款猜单词游戏,计算机想一个单词让你猜,你每次可以猜一字母 如果单词里有那个字母,所有该字母会显示出来。(例如“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;
}
上一篇:【后缀数组】板子 from Kausal


下一篇:JNOJ部署教程(4)—开机启动判题机