• 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;  
    }
    
  • 相关阅读:
    hdu 3068 最长回文
    Educational Codeforces Round 1 C. Nearest vectors
    Educational Codeforces Round 6 C. Pearls in a Row
    poj 3304 Segments
    Toy Storage
    poj 2318 TOYS
    CFA二级中文精讲(第2版)
    探秘大香格里拉
    巴西:热辣里约
    巴西:性感圣保罗
  • 原文地址:https://www.cnblogs.com/Hayasaka/p/14294227.html
Copyright © 2020-2023  润新知