UVA 489

在这里插入图片描述在这里插入图片描述

题目大意:

刽子手游戏:多组输入,每组输入一个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;  
}
原文地址:https://www.cnblogs.com/Hayasaka/p/14294227.html