题意:
给定两个字符串,第一个串是用来匹配的,从第二个串的第一个字符开始匹配,如果第二个串中的字符在第一个串出现,则表示猜中了,第一个串中的相同的那个字符都算被猜中;如果没有出现则表示猜错,同样的猜错只算一次。在整个匹配的过程中,如果在还没猜错7次之前,第一个串中所有的字符都被猜完了, 则输出“You win.”,如果你还没全部猜完的时候就已经猜错7次,则输出“You lose.”。如果整个匹配过程结束后,你没赢也没输,则输出“You chickened out.”。
解法:
先记录第一个串所有唯一的字符出现的次数,并保存在map中。然后扫描第二个串,实时记录猜对和猜错的情况,记录的时候不管是猜错还是猜对都要进行查重。每次匹配完一个字符就判断一下,是否是赢还是输。如果整个匹配过程下来都没输出赢或输。则输出“You chickened out.”。
AC代码如下:
/**
* Author: ACb0y
* FileName:489.cpp
* CreateTime: 2011年10月1日11:17:51
* Version: 1.0
*/
#include <iostream>
#include <set>
#include <map>
#include <string.h>
#include <stdio.h>
using namespace std;
int main()
{
int cas;
int total;
int r_cnt;
int e_cnt;
char s[1024];
char g[1024];
///统计每个字符出现的次数
map<char, int> m;
///猜错查重集合
set<char> error;
///猜对查重集合
set<char> right;
while (scanf("%d\n", &cas) != EOF)
{
if (cas == -1) break;
///每次的时候都清空容器
m.clear();
error.clear();
right.clear();
gets(s);
gets(g);
total = strlen(s);
char * p = s;
///统计每个字符出现的次数
while (*p)
{
if (m.find(*p) != m.end())
{
m[*p]++;
}
else
{
m[*p] = 1;
}
p++;
}
r_cnt = 0;
e_cnt = 0;
p = g;
int flag = 0;
while (*p)
{
///猜对
if (m.find(*p) != m.end())
{
///之前没猜对过
if (right.find(*p) == right.end())
{
r_cnt += m[*p];
right.insert(*p);
}
}
else ///猜错
{
///之前没猜错过
if (error.find(*p) == error.end())
{
e_cnt++;
error.insert(*p);
}
}
if (r_cnt == total)
{
flag = 1;
break;
}
if (e_cnt >= 7)
{
flag = 2;
break;
}
p++;
}
cout << "Round " << cas << endl;
switch(flag)
{
case 0:
cout << "You chickened out." << endl;
break;
case 1:
cout << "You win." << endl;
break;
case 2:
cout << "You lose." << endl;
break;
}
}
return 0;
}