• 传话游戏—C++


    编程之美一道简单的热身题,也是我们生活中常玩的传话游戏。(~.~芒果台玩过的)

    题意如下

      Alice和Bob还有其他几位好朋友在一起玩传话游戏。这个游戏是这样进行的:首先,所有游戏者按顺序站成一排,Alice站第一位,Bob站最后一位。然后,Alice想一句话悄悄告诉第二位游戏者,第二位游戏者又悄悄地告诉第三位,第三位又告诉第四位……以此类推,直到倒数第二位告诉Bob。两位游戏者在传话中,不能让其他人听到,也不能使用肢体动作来解释。最后,Bob把他所听到的话告诉大家,Alice也把她原本所想的话告诉大家。

         由于传话过程中可能出现一些偏差,游戏者越多,Bob最后听到的话就与Alice所想的越不同。Bob听到的话往往会变成一些很搞笑的东西,所以大家玩得乐此不疲。经过几轮游戏后,Alice注意到在两人传话中,有些词汇往往会错误地变成其他特定的词汇。Alice已经收集到了这样的一个词汇转化的列表,她想知道她的话传到Bob时会变成什么样子。

    输入

      输入包括多组数据。第一行是整数 T(1 ≤ T ≤ 100),表示有多少组测试数据。每组数据第一行包括两个整数 N 和 M,(2 ≤ N ≤ 100, 0 ≤ M ≤ 100)分别表示游戏者的数量和单词转化列表长度。随后有 M 行,每行包含两个用空格隔开的单词 a 和 b,表示单词 a 在传话中一定会变成 b。输入数据保证没有重复的 a。最后一行包含若干个用单个空格隔开的单词,表示Alice所想的句子,句子总长不超过100个字符。所有单词都只包含小写字母,并且长度不超过20,同一个单词的不同时态被认为是不同的单词。你可以假定不在列表中的单词永远不会变化。

    输出

    对于每组测试数据,单独输出一行“Case #c: s”。其中,c 为测试数据编号,s 为Bob所听到的句子。s 的格式与输入数据中Alice所想的句子格式相同。

    样例输入

    2
    4 3
    ship sheep
    sinking thinking
    thinking sinking
    the ship is sinking
    10 5
    tidy tiny
    tiger liar
    tired tire
    tire bear
    liar bear
    a tidy tiger is tired

    样例输出

    Case #1: the sheep is thinking
    Case #2: a tiny bear is bear

    解题思路 :将Alice说的话(带空格的字符串)分割成一个一个的单词,然后根据单词转化列表进行转换。我觉得比较特别的就是字符串的分割,C++没有Java中的split()函数,所以需自己编写分割字符串的代码,我的想法是声明一个vector,找到字符串中的空格下标,提取每个子串,push进vector中,再根据单词转化列表,替换vector中的值。

    代码如下:

    #include <iostream>
    #include <cstring>
    #include <vector>
    #include <map>
    using namespace std;
    
    int main()
    {
        int t,n,m;
        string word,a,b;
        map<string,string> change;   //使用map来记录单词转换表
        vector<string> strvec;       //vector变量来存取截取后的子串
        
        cin >> t;
        int cases = 1;
        while(cases <= t)
        {
            change.clear();
            strvec.clear();
            cin >> n >> m;
            for(int i = 0; i < m; i++ )
            {
                cin >> a >> b;
                change[a] = b;
            }
            do
            {
                getline(cin, word);    //以整行的形式读取字符串
            }while(word.empty());
            //printf("done
    ");
            
            string::size_type pos1, pos2;
            pos2 = word.find(' ');     //找到第一个空格位置
            pos1 = 0;        
            while (string::npos != pos2)
            {
                strvec.push_back(word.substr(pos1, pos2 - pos1));     //截取子串(单词)     
                pos1 = pos2 + 1;
                pos2 = word.find(' ', pos1);
            }
            strvec.push_back(word.substr(pos1));
            
            for(int i = 0; i < n-1; i++)                  //根据转换表进行n-1次转换
            {
                for(int j = 0; j < strvec.size(); j++)
                {
                    if(change.count(strvec[j]))
                        strvec[j] = change[strvec[j]];
                }
            }
            cout << "Case #" << cases << ": ";
            int k = 0;
            for(;k < strvec.size()-1; k++)
                cout << strvec[k] << " ";
            cout << strvec[k] << endl;
            cases++;
        }
        //system("pause");
        return 0;
    }
  • 相关阅读:
    Git忽略规则.gitignore梳理
    makefile 系统脚本分析
    Kipmi0 占用CPU 100%
    kubectl检查组件健康状态异常处理
    Java 数组如何转成List集合
    用户控件中多控件自定义单击事件
    DevExpress启动窗体SplashScreen
    使用C#获取统计局行政区划代码
    解决mysqlclient模块安装问题
    com.aspose.words 类LoadOptions
  • 原文地址:https://www.cnblogs.com/chenbjin/p/3647746.html
Copyright © 2020-2023  润新知