例题4-2 UVA489 Hangman Judge(22行AC代码)

紫书刷题进行中,题解系列点这里

例题4-2 UVA489 Hangman Judge(22行AC代码)

题目大意

刽子手游戏模拟,给定答案序列a猜测序列b(仅由小写字母构成),执行以下规则:

  • 对b中的每个字母ch,若ch存在于a,则将a中所有ch标记为已访问;否则累加错误次数
  • 若错误次数大于等于7,输出You lose.
  • 若错误次数小于7且a中完全被标记,输出You win.
  • 若错误次数小于7且a未完全被标记,输出You chickened out.

算法设计

定义set<char>ans,hit分别存储去重后的答案序列和命中序列,cnt记录错误次数。

枚举猜测序列b每个元素ch,若ch存在于ans,则将ch将入hit,否则cnt++,记录错误数,直至cnt=7或hit大小等于ans时结束循环。

注意点

  • 猜测序列存在重复字母,也需累计错误次数

AC代码(C++11,简单模拟,set)

#include<bits/stdc++.h>
using namespace std;
set<char> ans, hit; // 答案序列,命中序列
string a,b;
int id, cnt; // round,错误次数
int main() {
    while (scanf("%d", &id) && id != -1) {
        cin >>a >>b;
        ans.clear(); hit.clear(); cnt = 0; // 初始化
        for (auto ch : a) ans.insert(ch);
        for (auto ch : b) { // 遍历猜测序列
            if (cnt == 7 || ans.size() == hit.size()) break; // 错误7次|完全猜中
            if (ans.find(ch) != ans.end()) hit.insert(ch); // 猜中
            else cnt ++; // 未猜中
        }
        printf("Round %d\n", id);
        if (cnt == 7) printf("You lose.\n");
        else if (ans.size() == hit.size()) printf("You win.\n");
        else printf("You chickened out.\n");
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值