首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

2013 編程之美資格賽:傳話遊戲題目解析與代碼

     編輯:關於C語言

題目描述

Alice 和 Bob 等好友玩傳話遊戲:所有人按順序站成一排,Alice 第一位,Bob 最後一位。Alice 想一句話告訴第二位,依此類推傳到 Bob。因傳話可能出現偏差,遊戲者越多,Bob 聽到的話與 Alice 原話越不同。Alice 收集到詞彙轉換列表,想知道她的話傳到 Bob 時會變成什麼樣子。

輸入格式

  • 第一行整數 T,測試資料組數
  • 每組第一行兩個整數 N(遊戲者數量)和 M(單詞轉換列表長度)
  • 隨後 M 行,每行兩個單詞 a 和 b,表示單詞 a 傳話時一定會變成 b(無重複 a)
  • 最後一行包含若干單詞,表示 Alice 所想的句子(總長 ≤ 100 字符)
  • 所有單詞僅含小寫字母,長度 ≤ 20,不同時態視為不同單詞
  • 不在列表中的單詞永遠不變化

輸出格式

每組測試資料輸出一行 Case #c: s,c 為測試編號,s 為 Bob 聽到的句子。

資料範圍

  • 1 ≤ T ≤ 100
  • 小數據:2 ≤ N ≤ 10, 0 ≤ M ≤ 10
  • 大數據:2 ≤ N ≤ 100, 0 ≤ M ≤ 100

範例輸入/輸出

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

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

解題代碼(C++)

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

另一組使用 vector 和 split 函式的實作也附在文中。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved