紫书刷题进行中,题解系列点这里
例题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;
}