题目描述
题目解析
这一题看似简单其实有很多坑,我也被卡了好久才ac。首先题目的意思是,输入回合数,一个答案单词,和一个猜测单词,如果猜测的单词里存在答案单词里的所有字母则判定为赢,如果有一个字母是答案单词中没有的,那么记猜错一次,一旦猜错7次判定为输,如果猜对了一部分判定不输不赢。有一个很难注意到的坑是,猜测单词是从前往后一个个字母开始判定,一旦判定了输或赢直接结束,例如答案单词是abc,猜测单词是fffffffabc,虽然猜测单词里包含了答案单词里的所有字母,但是猜测单词里的前7个字母浪费了7次猜错的机会,则判定为输。
算法思路
输入回合数n,答案单词x1,猜测单词x2,用一个长度26,初始值为0的数组arr记录下答案单词中每个字母的出现次数。变量rest记录还剩下需要猜测的字母个数,当rest==0则判定为赢。变量chance记录剩余猜错的机会,当chance==0则判定为输,其余情况为不输不赢。从头往后遍历猜测单词x2中的每个字母,有下面三种情况
如果rest或chance其中一者为0说明已经判断出了这一轮的结果,那么结束遍历。
如果arr这个字母对应位置上的数字不是0或者-1,说明这个字母在答案单词x1中存在,更新rest的值为减去答案单词x1中这个字母的所有个数,然后修改arr中这个字母位置对应位置上的数字为-1,这样可以跳过之后在猜测单词x2中再次出现改字母的情况。
如果arr这个字母对应位置上的数字是0,说明这个字母在答案单词x1中不存在,chance的值减1。
代码实现
#include <bits/stdc++.h>
using namespace std;
int main()
{int n = 0;while (1){int chance = 7;cin >> n;if (n == -1)break;string x1, x2;cin >> x1 >> x2;int arr[26] = {0};int rest = x1.length();for (int i = 0; i < x1.length(); i++){arr[x1[i] - 'a']++;}for (int i = 0; i < x2.length(); i++){if (rest == 0 || chance == 0)break;if (arr[x2[i] - 'a'] != -1 && arr[x2[i] - 'a'] != 0){rest -= arr[x2[i] - 'a'];arr[x2[i] - 'a'] = -1;}else if (arr[x2[i] - 'a'] == 0)chance--;}cout << "Round " << n << endl;if (rest == 0)cout << "You win." << endl;else if (chance == 0)cout << "You lose." << endl;elsecout << "You chickened out." << endl;}return 0;
}