Hangman Judge UVA - 489

题目链接:https://vjudge.net/problem/UVA-489
Hangman Judge UVA - 489Hangman Judge UVA - 489
题目大意:刽子手游戏其实是一款猜单词游戏。游戏规则是这样的:计算机想一个单词让你猜,你每次可以猜一个字母。如果单词里有那个字母,所有该字母会显示出来;如果没有那个字母,则计算机会在“刽子手”画上填一笔。这幅画一共需要七笔,因此你最多只能错六次。注意:猜一个已经猜过的字母也算错。
在本题中,你的任务是编写一个“裁判”程序,输入单词和玩家的猜测,判断玩家赢了(You win),输了(You lose),还是放弃了(You chickened out)。

解析:You chickened out代表你的猜测既没有完成游戏,也没有输了游戏。
我定义了一个数组arr来判断单词中字母是否被猜测过,猜对一次单词中字母,单词中该字母(所有)对应arr数组位置变为1(初始化为0)。猜错一次,cnt++,最后判断cnt是否大于等于7和arr数组是否全部都变为1.
1.cnt<7但是arr数组没有全变为1,You chickened out。
2.cnt<7并且arr数组全为1,You win。
3,cnt>7,You lose。

#include <string.h>
#include <math.h>
#include <stdlib.h>
#define maxn 100000
int main()
{
    freopen("i.txt","r",stdin);
    char s1[maxn], s2[maxn];
    int arr[maxn];
    int n, f1,cnt, f2, f3;
    while(scanf("%d",&n) && n!=-1) {
        memset(arr, 0, sizeof(arr));
        printf("Round %d\n",n++);
        scanf("%s%s",s1,s2);
        cnt = 0, f2 = 0;
        for(int i = 0; s2[i]; i++) {
            f1 = 0,f3 = 0;
            for(int j = 0; s1[j]; j++) {
                if(s2[i]==s1[j] && !arr[j]) {
                    arr[j] = 1;
                    f1 = 1;
                    break;
                }
            }
            if(f1) {
                for(int j = 0; s1[j]; j++)
                    if(s2[i]==s1[j]) arr[j] = 1;
            }
            else {
                for(int j = 0; s1[j]; j++)
                    if (!arr[j]) f3 = 1;
                if(f3) cnt++;
            }
        }
        for(int i = 0; s1[i]; i++)
            if (!arr[i]) f2 = 1;
        if(cnt<7 && !f2) printf("You win.\n");
        else if(cnt<7 && f2) printf("You chickened out.\n");
        else if(cnt>=7) printf("You lose.\n");
    }
}