【UVA-489】Hangman Judge【紫书】

【UVA-489】Hangman Judge【紫书】

问题链接:https://vjudge.net/problem/UVA-489

Solution:

这类讲述一个规则的问题一定要把规则理解清楚,并且保证编码实现了所有的规则,这样才能确保正确性。这道题规则上的关键:

1)如果再猜已经猜测过的字符,无论上回猜测对错,这次都不考虑。

2)猜测正确时相当于所有同类字符皆猜出。

3)对于一串猜测,当满足:猜错次数大于等于7,或已猜出全部字符,这两个条件之一时,游戏结束。

#include <iostream>
#include <string>
#include <cstring>

using namespace std;

const int NIL = -1;
const int LIM = 26;
int table[LIM];

int main(void) {
    int k;
    string str;
    while (~scanf("%d", &k) && k != -1) {
        memset(table, NIL, sizeof table);
        int cnt = 0, i, num = 0;
        cin >> str;
        for (i = 0; i < str.size(); i++) {
            if (table[str[i] - 'a'] == NIL) table[str[i] - 'a'] = 0;
            table[str[i] - 'a']++;
            num++;
        }
        cin >> str;
        for (i = 0; i < str.size() && cnt < 7 && num; i++) {
            if (table[str[i] - 'a'] != NIL) {
                num -= table[str[i] - 'a'];
                table[str[i] - 'a'] = 0;
            } else {
                cnt++;
                table[str[i] - 'a'] = 0;
            }
        }
        printf("Round %d\n", k);
        if (cnt >= 7) printf("You lose.\n");
        else if (!num) printf("You win.\n");
        else printf("You chickened out.\n");
    }
    return 0;
}