题目大意:
刽子手游戏:多组输入,每组输入一个k表示第k组数据,然后输入两个串a b,需要猜的是a串,每次猜的字符是b串,游戏规则是这样的:
- 如果这个字符在a串中出现过,那么a中所有该字符都会消除
- 最多猜错6次,如果第7次猜错,则游戏失败
- 猜已经猜过的字符会被判定为错
- 如果错误不足7次而又没猜出来视为放弃
解题思路:
设一个win和lose变量代表当前状态,变量mis代表可允许的剩余错误次数,len表示a串还剩多少字符没才出来。遍历b串的每一个字符,然后去a找这个字符有没有出现过,如果自始至终没出现过则mis–,如果找到则把a串所有该字符都变成‘0’,并且len–,每次猜测后都判断一下,如果len=0则说明猜对了,退出。如果mis=0则说明机会用完了,错误,退出。其他情况则视为放弃。AC代码:
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int mod = 1e9+7;
typedef long long ll;
const int _max = 1e6+50;
string a,b;
int k,mis,len;
bool guess(char ch)//遍历a串去消除字符
{
bool flag=false;//判断是否出现至少一次
for(auto &i:a)//&引用方式能够直接改串中的值
if(i==ch)
{
flag=true;
i='0';
len--;
}
return flag;
}
int main()
{
while(cin>>k>>a>>b)
{
if(k==-1)
break;
bool win=false,lose=false;
mis=7,len=a.length();
for(auto i:b)
{
if(!guess(i))
mis--;//没猜出来机会数要--
if(!mis)
lose=true;
if(!len)
win=true;
if(win||lose)//判断状态提前退出
break;
}
printf("Round %d
",k);
if(win)
cout<<"You win."<<endl;
else if(lose)
cout<<"You lose."<<endl;
else
cout<<"You chickened out."<<endl;
}
return 0;
}
第一次用的更暴力…没有想到通过剩余长度len来判断是否猜完而是去遍历a串…然后看紫皮书写出了上面的算法…思维还是不够强 放上第一次写的代码:
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int mod = 1e9+7;
typedef long long ll;
const int _max = 1e6+50;
string a,b;
int k;
bool guess(char ch)
{
bool flag=false;
for(auto &i:a)
if(i==ch)
{
flag=true;
i='0';
}
return flag;
}
bool guess1()//每次都判断是不是a中都猜对了
{
for(auto i:a)
if(i!='0') return false;
return true;
}
int main()
{
while(cin>>k>>a>>b)
{
if(k==-1)
break;
bool win=false,lose=false;
int mis=0;
for(auto i:b)
{
if(!guess(i))
mis++;
else
win=guess1();//一次一判断
if(mis==7)
lose=true;
if(win||lose)
break;
}
printf("Round %d
",k);
if(win)
cout<<"You win."<<endl;
else if(lose)
cout<<"You lose."<<endl;
else
cout<<"You chickened out."<<endl;
}
return 0;
}