问题

模拟|哈希|UVA489 Hangman Judge - 图1

题解

复建第一题,被坑惨了。理解题意很重要,不要看中文翻译:如果之后出现重复字母,则错误次数+1而不是失败。

大致意思就是在字符串1中找到是否有字符串2中的字母,最多可以找错7次。

成功:没猜单词==0

失败:没猜单词>0 && 所剩机会==0

放弃:!成功 && !失败

可以自然想到哈希表,用alpha[x]表示字母x是否出现过。

技巧是如果这个字母已经出现过,则直接把**alpha[x] = false**,解决重复出现字母的问题。

然后是输入问题,没有给出字符串长度,考虑都是对字母做处理可以直接读取字符。(不过好像并没有在这个地方设坑….)

当然可以用std::set实现。

AC代码

  1. /*
  2. 模拟 哈希
  3. 成功:没猜单词==0
  4. 失败:没猜单词>0 && 所剩机会==0
  5. 放弃:!成功 && !失败
  6. */
  7. #include <iostream>
  8. #include <cstdio>
  9. #define MAXN 30
  10. int main()
  11. {
  12. int rnd = 0, left = 0, chance = 7;
  13. bool win = 0, lose = 0;
  14. bool alpha[MAXN];
  15. while (scanf("%d", &rnd) && rnd != -1)
  16. {
  17. getchar();
  18. // 初始化
  19. for (int i = 0;i < MAXN;i++)
  20. alpha[i] = 0;
  21. left = 0;chance = 7;
  22. win = lose = 0;
  23. char ch;
  24. // 处理计算机给出字符串
  25. while ((ch=getchar()) != '\n')
  26. if (!alpha[ch - 97])
  27. {
  28. alpha[ch - 97] = 1;
  29. ++left;
  30. }
  31. // 处理所猜字符串
  32. while ((ch = getchar()) != '\n')
  33. {
  34. if (win || lose) continue;//保证字符串读取完整
  35. if (alpha[ch - 97]) --left;
  36. else --chance;
  37. alpha[ch - 97] = 0;
  38. if (!chance) lose = 1;
  39. if (!left) win = 1;
  40. }
  41. // 判断结果
  42. printf("Round %d\n", rnd);
  43. if (win) printf("You win.\n");
  44. else if (lose) printf("You lose.\n");
  45. else printf("You chickened out.\n");
  46. }
  47. return 0;
  48. }