2013编程之美全国挑战赛资格赛之传话游戏

时间限制: 1000ms 内存限制: 256MB

描述

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

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

输入

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

输出

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

数据范围

1 ≤ T ≤ 100

小数据:2 ≤ N ≤ 10, 0 ≤ M ≤ 10 

大数据:2 ≤ N ≤ 100, 0 ≤ M ≤ 100 

样例输入


  1. 4 3 
  2. ship sheep 
  3. sinking thinking 
  4. thinking sinking 
  5. the ship is sinking 
  6. 10 5 
  7. tidy tiny 
  8. tiger liar 
  9. tired tire 
  10. tire bear 
  11. liar bear 
  12. a tidy tiger is tired 

样例输出


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

 

代码如下:


  1. #include <cstdio> 
  2. #include <cstring> 
  3. #include <cmath> 
  4. #include <string> 
  5. #include <iostream> 
  6. #include <map> 
  7.   
  8. using namespace std; 
  9.   
  10. map<string,string> mm; 
  11. char s1[30],s2[30],s[110],*p; 
  12. int t,m,n; 
  13.   
  14. void solve() 
  15.     int i; 
  16.     string str; 
  17.     str=p; 
  18.     for(i=1;i<n;i++)  
  19.     { 
  20.         if(mm.count(str)) 
  21.             str=mm[str]; 
  22.         else 
  23.             break; 
  24.     }  
  25.     cout<<str; 
  26.   
  27. int main() 
  28.     int i,cnt;scanf("%d%*c",&t); 
  29.     for(cnt=1;cnt<=t;cnt++) 
  30.     { 
  31.         mm.clear(); 
  32.         scanf("%d %d%*c",&n,&m); 
  33.         for(i=0;i<m;i++) 
  34.         { 
  35.             scanf("%s %s%*c",s1,s2); 
  36.             mm[s1]=s2; 
  37.         } 
  38.         gets(s); 
  39.         printf("Case #%d: ",cnt); 
  40.         p=strtok(s," "); 
  41.         solve(); 
  42.         while((p=strtok(NULL," "))) 
  43.         { 
  44.             cout<<" "; 
  45.             solve(); 
  46.         } 
  47.         cout<<endl; 
  48.     } 
  49.   
  50.     return 0; 

上述代码来自:http://blog.sina.com.cn/s/blog_959bf1d30101evsx.html

另一组代码:


  1. #include <stdio.h> 
  2. #include <cstring> 
  3. #include <vector> 
  4. #include <map> 
  5.   
  6. using namespace std; 
  7.   
  8.   
  9. //字符串分割函数 
  10.  std::vector<std::string> split(std::string str,std::string pattern) 
  11.  { 
  12.      std::string::size_type pos; 
  13.      std::vector<std::string> result; 
  14.      str+=pattern;//扩展字符串以方便操作 
  15.      int size=str.size(); 
  16.   
  17.      for(int i=0; i<size; i++) 
  18.      { 
  19.          pos=str.find(pattern,i); 
  20.          if(pos<size) 
  21.          { 
  22.              std::string s=str.substr(i,pos-i); 
  23.              result.push_back(s); 
  24.              i=pos+pattern.size()-1; 
  25.          } 
  26.      } 
  27.      return result; 
  28.  } 
  29.   
  30. void Update(vector<string> & str,map<string,string> & w_map) 
  31.     map<string,string>::iterator it; 
  32.     for(int i=0;i<str.size();i++) 
  33.     { 
  34.         it = w_map.find(str[i]); 
  35.         if(it != w_map.end()) 
  36.         { 
  37.             str[i]=it->second; 
  38.         } 
  39.     } 
  40.   
  41. int main() 
  42.     int T; 
  43.   
  44.     while(scanf("%d",&T) == 1) 
  45.     { 
  46.         for(int x=1;x<=T;x++) 
  47.         { 
  48.             int N,M; 
  49.             map<string,string> words_map; 
  50.             string s1,s2; 
  51.             string srcWords,tgtWords; 
  52.   
  53.             scanf("%d%d",&N,&M); 
  54.             for(int i=1;i<=M;i++) 
  55.             { 
  56.                 cin>>s1>>s2; 
  57.                 words_map.insert(make_pair(s1,s2)); 
  58.             } 
  59.             cin.get();//吃掉上一行换行符 
  60.             getline(cin,srcWords,'\n'); 
  61.             vector<string> singleWord = split(srcWords," "); 
  62.   
  63.   
  64.             for(int i=1;i<=N-1;i++) 
  65.             { 
  66.                 Update(singleWord,words_map); 
  67.             } 
  68.             printf("Case #%d: ",x); 
  69.             for(int i=0;i<singleWord.size()-1;i++) 
  70.                 cout<<singleWord[i]<<" "; 
  71.             cout<<singleWord[singleWord.size()-1]<<endl; 
  72.         } 
  73.   
  74.     } 
  75.     return 0; 

来自:http://blog.csdn.net/xihuanqiqi/article/details/8763444

时间: 2024-08-19 22:50:18

2013编程之美全国挑战赛资格赛之传话游戏的相关文章

2013编程之美全国挑战赛第一场-传话游戏

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

2013编程之美全国挑战赛第二场-集会

昨天做编程之美的题感觉只有这一道是水题.思路没问题但是写程序写错了一个地方没AC.今天翻出来想了一下终于解决了. 解题思路: 要寻找的这个目标点的纵坐标为0,设横坐标为x.以示例数据为例,可以得到目标点到这些点的距离,更直观一点,绘制成图形点击查看.观察可知符合要求的点可能出现的位置是某两个抛物线的交点或者某个抛物线的顶点.求出这些点来比较计算出的距离,取最小的即可.没机会提交的代码如下: import java.util.Scanner; public class Main { public

2013编程之美全国挑战赛第一场-树上的三角形

树上三角形 时间限制: 2000ms 内存限制: 256MB 描述 有一棵树,树上有只毛毛虫.它在这棵树上生活了很久,对它的构造了如指掌.所以它在树上从来都是走最短路,不会绕路.它还还特别喜欢三角形,所以当它在树上爬来爬去的时候总会在想,如果把刚才爬过的那几根树枝/树干锯下来,能不能从中选三根出来拼成一个三角形呢? 输入 输入数据的第一行包含一个整数 T,表示数据组数. 接下来有 T 组数据,每组数据中: 第一行包含一个整数 N,表示树上节点的个数(从 1 到 N 标号). 接下来的 N-1 行

2013编程之美资格赛之长方形(Java实现)

长方形 时间限制: 1000ms 内存限制: 256MB 描述 在 N 条水平线与 M 条竖直线构成的网格中,放 K 枚石子,每个石子都只能放在网格的交叉点上.问在最优的摆放方式下,最多能找到多少四边平行于坐标轴的长方形,它的四个角上都恰好放着一枚石子. 输入 输入文件包含多组测试数据. 第一行,给出一个整数T,为数据组数.接下来依次给出每组测试数据. 每组数据为三个用空格隔开的整数 N,M,K. 输出 对于每组测试数据,输出一行"Case #X: Y",其中X表示测试数据编号,Y表示

2013编程之美资格赛之树上的三角形(Java实现)

树上的三角形 时间限制: 2000ms 内存限制: 256MB 描述 有一棵树,树上有只毛毛虫.它在这棵树上生活了很久,对它的构造了如指掌.所以它在树上从来都是走最短路,不会绕路.它还还特别喜欢三角形,所以当它在树上爬来爬去的时候总会在想,如果把刚才爬过的那几根树枝/树干锯下来,能不能从中选三根出来拼成一个三角形呢? 输入 输入数据的第一行包含一个整数 T,表示数据组数. 接下来有 T 组数据,每组数据中: 第一行包含一个整数 N,表示树上节点的个数(从 1 到 N 标号). 接下来的 N-1

2013编程之美资格赛总结

终于可以完成一个程序比赛的题目了,虽然这次的时间有些长.这是第一次完成,感到真心不错.参加程序比赛是受舍友的影响,但很快就喜欢上了.但,从前不见第一次参加程序比赛--腾讯的编程马拉松,一个题不会,连提交代码的心思都没有.到第二次,参加百度的百度之星,百度之星参加了两次区域赛,第一次做的唯一一道题连题意都没有明白,结果不言而喻,失败:第二次区域赛,明白了题意,写出来代码,但提交结果还是失败,因为没有对于大数据进行思考.这就是参加的两次比赛的情况.这是第三次参加,是微软的编程之美,依据现在的结果,感

2013编程之美资格赛【传话游戏】

时间限制: 1000ms 内存限制: 256MB 描述 Alice和Bob还有其他几位好朋友在一起玩传话游戏.这个游戏是这样进行的:首先,所有游戏者按顺序站成一排,Alice站第一位,Bob站最后一位.然后,Alice想一句话悄悄告诉第二位游戏者,第二位游戏者又悄悄地告诉第三位,第三位又告诉第四位--以此类推,直到倒数第二位告诉Bob.两位游戏者在传话中,不能让其他人听到,也不能使用肢体动作来解释.最后,Bob把他所听到的话告诉大家,Alice也把她原本所想的话告诉大家.  由于传话过程中可能出

2013编程之美资格赛之传话游戏(Java实现)

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

2013编程之美资格赛之大数据测试(JAVA)

传话游戏大数据通过 长方形WA.原因是求长方形数量时,用到了四数连乘,哦,其结果就是超出Int型表示的范围,WA是必然的. 树上的三角形TLE.这个也是在情理之内,由于我连树的构造都不太会实现,自己想的一种方法构造了一种类树(就是类似的树).时间会比较长,超时也在情理之中. 哦.说一下结果,   题目1 题目2 题目3 名次 大赛ID 得分 罚时 10分 20分 15分 20分 15分 20分 622 fxleyu 60 165:32:12 AC AC AC WA AC TLE  好吧,这就是这