【C++】B2112 石頭剪子布


在這里插入圖片描述

博客主頁: [小????????]
本文專欄: C++

文章目錄

  • 💯前言
  • 💯題目描述
    • 游戲規則:
    • 輸入格式:
    • 輸出格式:
    • 輸入輸出樣例:
    • 解題分析與實現
  • 💯我的做法
    • 實現邏輯
    • 優點與不足
  • 💯老師的做法
    • 實現邏輯
    • 優點與不足
  • 💯對比分析
  • 💯優化與擴展
    • 優化代碼實現
    • 優化后的優點
    • 擴展場景
  • 💯總結


在這里插入圖片描述


💯前言

  • "石頭剪子布"是一種經典游戲,它不僅規則簡單,還能引發復雜的編程邏輯討論。在本篇文章中,我們將以一道 C++ 的編程題為例,深入剖析解題的思路、優化方法,以及延伸出的編程概念。通過對比兩種實現方式(我的實現和老師的實現),結合擴展性和代碼優化的思路,幫助讀者全面理解這一題目及其潛在的編程技巧。
    C++ 參考手冊
    在這里插入圖片描述

💯題目描述

B2112 石頭剪子布
在這里插入圖片描述

石頭剪子布,是一種猜拳游戲,起源于中國,然后傳到日本,朝鮮等地,隨著亞歐貿易的不斷發展它傳到西歐,到了現代化逐漸國際化的世界中。簡單明了的規則,使得石頭剪子布沒有任何知識和規則漏洞可鉆,單次玩法讓比賽公平,容易且充滿心理博弈,使得石頭剪子布這個古老的游戲同時用于“意外”與“技術”兩種特性,深受世界人民喜愛。

游戲規則:

石頭剪子布,布包石頭,石頭砸剪刀,剪刀剪布。

現在,需要你寫一個程序來判斷石頭剪子布游戲的結果。

輸入格式:

第一行是一個整數 N,表示一共進行 N 次游戲。1 <= N <= 100。
接下來 N 行的每一行包括兩個字符串,表示游戲參與者 Player1,Player2 的選擇(石頭、剪刀或者布):S1,S2。

字符串之間以空格隔開 S1 S2 只可能取值在 [Rock, Scissors, Paper](大小寫敏感)中。

輸出格式:

輸出包括 N 行,每一行對應一個勝利者(Player1 或者 Player2),或者游戲出現平局,則輸出 Tie。

輸入輸出樣例:

輸入 #1

3
Rock Scissors
Paper Paper
Rock Paper

輸出 #1

Player1
Tie
Player2

解題分析與實現

接下來,我們將從兩個實現方式出發:我的做法、老師的做法,逐步剖析解決問題的不同方式,最后對比兩種實現,并延展出優化和擴展思路。

💯我的做法

以下是我的代碼實現:

#include <iostream>
#include <string>
using namespace std;int main()
{	int n;cin >> n;string s1, s2;for(int i = 0; i < n; i++){cin >> s1 >> s2;if(s1 == "Rock"){if(s2 == "Scissors")cout << "Player1" << endl;else if(s2 == "Paper")cout << "Player2" << endl;elsecout << "Tie" << endl;}else if(s1 == "Scissors")	{if(s2 == "Scissors")cout << "Tie" << endl;else if(s2 == "Paper")cout << "Player1" << endl;elsecout << "Player2" << endl;}else{if(s2 == "Scissors")cout << "Player2" << endl;else if(s2 == "Paper")cout << "Tie" << endl;elsecout << "Player1" << endl;}}return 0;
}

在這里插入圖片描述

實現邏輯

  1. 輸入處理:讀取整數 n,表示對局次數,循環讀取 Player1Player2 的選擇。

  2. 判斷規則:

    • 通過嵌套的 if-else 分支,根據 Player1 的選擇 (Rock, Scissors, Paper) 逐步判斷 Player2 的選擇,從而決定勝負。
    • 平局條件 (s1 == s2) 被單獨處理。
  3. 逐行輸出:根據每場比賽的結果,輸出 “Player1”、“Player2” 或 “Tie”。

優點與不足

  • 優點:

    • 邏輯清晰,適合初學者。
    • 每種情況都顯式列出,容易理解。
  • 不足:

    • 冗余邏輯:大量的條件分支導致代碼較為臃腫。
    • 可擴展性差:如果加入新規則(如 “Lizard” 和 “Spock”),代碼需要大規模改動。

💯老師的做法

以下是老師的代碼實現:

#include <iostream>
#include <string>
using namespace std;int main()
{int n = 0;cin >> n;int i = 0;string s1;string s2;while(n--){cin >> s1;cin >> s2;if(s1 == s2)cout << "Tie" << endl;else if (s1 == "Rock" && s2 == "Scissors")cout << "Player1" << endl;else if (s1 == "Scissors" && s2 == "Paper")cout << "Player1" << endl;else if (s1 == "Paper" && s2 == "Rock")cout << "Player1" << endl;elsecout << "Player2" << endl;}	return 0;
}

在這里插入圖片描述

實現邏輯

  1. 使用 while 循環減少代碼結構的復雜性,每次循環中處理一場比賽。
  2. 平局條件 (s1 == s2) 優先判斷,避免進入更多分支。
  3. Player1 的勝利條件通過顯式列舉的方式判斷。
  4. 如果上述條件都不滿足,則默認為 Player2 勝出。

優點與不足

  • 優點:

    • 代碼結構簡潔,分支層次少。
    • 平局條件優先處理,邏輯順暢。
  • 不足:

    • 同樣存在條件分支冗余問題。
    • 可擴展性不足。

💯對比分析

對比點我的做法老師的做法
代碼結構使用嵌套 if-else,分支較多使用單層 if-else,邏輯更清晰
冗余程度條件分支更多,顯式判斷所有情況條件分支較少,但仍有顯式判斷
可擴展性新規則需要大規模修改新規則需要大規模修改
適合初學者邏輯直觀,適合初學者練習邏輯簡化,更適合掌握基本結構的學生

💯優化與擴展

為了進一步優化和擴展,我們可以使用數據結構來簡化邏輯,提高可擴展性。

優化代碼實現

通過使用 map 存儲勝負規則,可以避免顯式列舉所有情況。

#include <iostream>
#include <string>
#include <map>
using namespace std;int main() {int n;cin >> n;// 定義勝負規則map<string, string> winRules = {{"Rock", "Scissors"},{"Scissors", "Paper"},{"Paper", "Rock"}};string s1, s2;while (n--) {cin >> s1 >> s2;if (s1 == s2) {cout << "Tie" << endl;} else if (winRules[s1] == s2) {cout << "Player1" << endl;} else {cout << "Player2" << endl;}}return 0;
}

優化后的優點

  1. 邏輯簡化:通過查表判斷勝負,避免嵌套的 if-else
  2. 易擴展性:增加新規則只需擴展 map,無需修改核心邏輯。
  3. 代碼簡潔:主邏輯更清晰,減少冗余判斷。

擴展場景

  1. 多種新規則:如引入 “Lizard” 和 “Spock”。
  2. 支持多輪游戲:記錄每場比賽的勝利者,并統計最終勝負結果。
  3. 本地化支持:使用多語言輸出結果。

💯總結

通過這道題目,我們探討了兩種不同的解法,以及如何優化代碼邏輯。我的實現和老師的實現都能正確解決問題,但在簡潔性和擴展性上存在一定不足。優化后的代碼通過數據結構簡化了邏輯,提高了代碼的可維護性和可擴展性。

編程不僅僅是實現功能,還在于如何更優雅、更高效地實現。本題為我們提供了一個非常好的練習機會,希望讀者在掌握了這些方法后,能更深入地理解編程的本質和技巧。


在這里插入圖片描述


在這里插入圖片描述在這里插入圖片描述在這里插入圖片描述在這里插入圖片描述在這里插入圖片描述在這里插入圖片描述在這里插入圖片描述在這里插入圖片描述在這里插入圖片描述在這里插入圖片描述

1. 理解C++的基礎
學習重點:

  1. 掌握基本語法
    • 學會聲明變量、條件語句、循環、函數等核心語法。
    • 掌握數組、指針、引用等基礎知識。
  2. 熟悉標準輸入輸出
    • 掌握 cincout 的用法。
    • 理解格式化輸出,例如 std::setwstd::fixed
  3. 記住編譯器的角色
    • 理解源代碼如何通過編譯器轉換為可執行程序,選擇一款好的IDE(如Visual Studio、Clion、VSCode)。

建議:用大量小程序練習這些基礎語法,比如寫一個計算器、模擬猜數字游戲等。


2. 深入學習C++的特性
學習重點:

  1. 面向對象編程(OOP)
    • 理解類和對象,熟悉如何定義類、成員變量和成員函數。
    • 掌握封裝、繼承、多態三大核心特性。
  2. 內存管理
    • 理解指針的用法,掌握動態內存分配(newdelete)。
    • 學習如何避免內存泄漏,熟悉智能指針(如std::unique_ptrstd::shared_ptr)。
  3. 標準模板庫(STL)
    • 熟悉常用的容器(如vectormapset)和算法(如sortfind)。
    • 掌握迭代器的用法。
  4. 異常處理
    • 學習使用try-catch塊處理異常。
    • 理解異常的用途以及如何設計健壯的代碼。

建議:嘗試開發一個小型項目,比如一個學生管理系統,綜合應用類、STL、指針和動態內存分配。


3. 掌握進階內容
學習重點:

  1. 模板
    • 理解函數模板和類模板,掌握泛型編程思想。
    • 學習模板特化和模板元編程的基本概念。
  2. 多線程與并發
    • 學習 C++11 提供的多線程支持(如std::thread)。
    • 熟悉互斥鎖(std::mutex)和條件變量(std::condition_variable)。
  3. C++與C的兼容性
    • 學習如何在C++中使用C語言代碼,理解C和C++的區別。
    • 掌握C風格字符串(char[])和C++字符串(std::string)的轉換。

建議:在這一階段,可以挑戰更復雜的項目,比如開發一個小型的HTTP服務器,學習網絡編程并結合多線程。


4. 學習資源與實踐方法
學習資源:

  1. 書籍
    • 《C++ Primer》:非常適合初學者的經典書籍。
    • 《Effective C++》:進階學習C++最佳實踐的指南。
    • 《The C++ Programming Language》:Bjarne Stroustrup(C++之父)的權威著作。
  2. 在線課程
    • Coursera 上的 C++ 編程課程。
    • YouTube 上免費的 C++ 系列教程。
  3. 社區與文檔
    • 參與C++相關的論壇(如CSDN、Stack Overflow)。
    • 閱讀官方文檔(https://en.cppreference.com)。

實踐方法:

  1. 多寫代碼,多調試
    • 每學一個概念后,寫至少兩個示例代碼并進行調試。
  2. 做小項目
    • 從簡單的控制臺程序開始,比如文件讀寫、計算器、小游戲等。
    • 慢慢過渡到圖形界面或網絡程序開發。
  3. 閱讀他人代碼
    • 閱讀開源項目的代碼,理解優秀代碼的設計思路。
  4. 參加編程比賽
    • 比如 LeetCode 或 Codeforces,可以幫助你提升算法能力和C++的熟練度。

5. 保持耐心與興趣
學習C++可能會面臨以下困難:

  1. 復雜的語法:如模板、智能指針、多線程等。
  2. 調試困難:指針錯誤、內存泄漏、未定義行為可能讓人頭疼。

如何應對:

  • 將大問題拆解成小問題,逐步解決。
  • 不斷重復基礎知識,以加深理解。
  • 保持興趣,嘗試一些有趣的項目,比如寫一個游戲、制作一個簡單的圖形程序。

小結
學習C++需要一個循序漸進的過程,從基礎語法到面向對象編程,再到進階的模板和并發編程,每一步都需要耐心和實踐。通過充分利用學習資源、進行大量編碼練習,以及挑戰實際項目,你一定可以成為C++的高手。記住,學習的核心在于理解,而非死記硬背。

祝你學有所成,享受C++編程的樂趣!


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/66153.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/66153.shtml
英文地址,請注明出處:http://en.pswp.cn/web/66153.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

內存快照:宕機后Redis如何實現快速恢復?

文章目錄 給哪些內存數據做快照&#xff1f;快照時數據能修改嗎?可以每秒做一次快照嗎&#xff1f;小結每課一問 更多redis相關知識 上節課&#xff0c;我們學習了 Redis 避免數據丟失的 AOF 方法。這個方法的好處&#xff0c;是每次執行只需要記錄操作命令&#xff0c;需要持…

系統架構設計師考點—項目管理

一、備考指南 項目管理主要考查的是進度管理、軟件配置管理、質量管理、風險管理等相關知識&#xff0c;近幾年都沒有考查過&#xff0c;但是有可能在案例分析中考查關鍵路徑的技術問題&#xff0c;考生了解為主。 二、重點考點 1、項目的十大管理&#xff08;速記&#xff1…

iOS - Objective-C 底層實現中的哈希表

1. 關聯對象存儲&#xff08;AssociationsHashMap&#xff09; // 關聯對象的哈希表實現 typedef DenseMap<const void *, ObjcAssociation> ObjectAssociationMap; typedef DenseMap<DisguisedPtr<objc_object>, ObjectAssociationMap> AssociationsHashMa…

兩分鐘解決 :![rejected] master -> master (fetch first) , 無法正常push到遠端庫

目錄 分析問題的原因解決 分析問題的原因 在git push的時候莫名遇到這種情況 若你在git上修改了如README.md的文件。由于本地是沒有README.md文件的&#xff0c;所以導致 遠端倉庫git和本地不同步。 將遠端、本地進行合并就可以很好的解決這個問題 注意&#xff1a;直接git pu…

Ubuntu Server 24.04 配置靜態IP

Ubuntu Server 24.04 配置靜態IP 提示&#xff1a;基于Ubuntu Server 24.04進行配置 文章目錄 Ubuntu Server 24.04 配置靜態IP一、查看網卡信息二、修改網卡信息三、使網卡配置生效四、測試 一、查看網卡信息 使用命令 ip a lo 為本地回環地址 ens33 真實網卡地址 shanfengubu…

微服務之松耦合

參考&#xff1a;https://microservices.io/post/architecture/2023/03/28/microservice-architecture-essentials-loose-coupling.html There’s actually two different types of coupling: runtime coupling - influences availability design-time coupling - influences…

Django 和 Vue3 前后端分離開發筆記

Django 和 Vue3 前后端分離開發筆記 1. Django Ninja API Django Ninja 是一個用于使用 Django 和 Python 3.6 類型提示構建 API 的網絡框架。它具有以下主要特點&#xff1a; 簡單易懂&#xff1a;設計為易于使用和符合直覺&#xff0c;適合快速上手。快速執行&#xff1a;…

44_Lua迭代器

在Lua中,迭代器是一種用于遍歷集合元素的重要工具。掌握迭代器的使用方法,對于提高Lua編程的效率和代碼的可讀性具有重要意義。 1.迭代器概述 1.1 迭代器介紹 迭代器是一種設計模式,它提供了一種訪問集合元素的方法,而不需要暴露其底層結構。在Lua中,迭代器通常以一個函…

hot100_240. 搜索二維矩陣 II

hot100_240. 搜索二維矩陣 II 直接遍歷列減行增 編寫一個高效的算法來搜索 m x n 矩陣 matrix 中的一個目標值 target 。該矩陣具有以下特性&#xff1a; 每行的元素從左到右升序排列。 每列的元素從上到下升序排列。 示例 1&#xff1a; 輸入&#xff1a;matrix [[1,4,7,1…

一步到位Python Django部署,淺談Python Django框架

Django是一個使用Python開發的Web應用程序框架&#xff0c;它遵循MVC&#xff08;Model-View-Controller&#xff09;設計模式&#xff0c;旨在幫助開發人員更快、更輕松地構建和維護高質量的Web應用程序。Django提供了強大的基礎設施和工具&#xff0c;以便于處理復雜的業務邏…

Apache PAIMON 學習

參考&#xff1a;Apache PAIMON&#xff1a;實時數據湖技術框架及其實踐 數據湖不僅僅是一個存儲不同類數據的技術手段&#xff0c;更是提高數據分析效率、支持數據驅動決策、加速AI發展的基礎設施。 新一代實時數據湖技術&#xff0c;Apache PAIMON兼容Apache Flink、Spark等…

《計算機網絡》課后探研題書面報告_了解PPPoE協議

PPPoE協議的工作原理與應用分析 摘 要 PPPoE&#xff08;Point-to-Point Protocol over Ethernet&#xff09;是一種廣泛應用于寬帶接入的網絡協議&#xff0c;特別是在DSL&#xff08;數字用戶線路&#xff09;和光纖網絡中具有重要的應用價值。PPPoE結合了PPP協議的認證、加…

【MySQL學習筆記】MySQL存儲過程

存儲過程 1、基礎語法2、變量2.1 系統變量2.2 用戶自定義變量2.3 局部變量 3、if 流程控制4、參數5、case 流程控制6、循環結構6.1 while 循環6.2 repeat 循環6.3 loop 循環 7、游標8、存儲函數 存儲過程是事先經過編譯并存儲在數據庫中的一段 SQL 語句的集合&#xff0c;調用存…

MAC上安裝Octave

1. 當前最新版Octave是9.3版本&#xff0c;需要把mac os系統升級到14版本&#xff08;本人之前的版本是10版本&#xff09; https://wiki.octave.org/Octave_for_macOS octave的歷史版本參考此文檔&#xff1a;Octave for macOS (outdated) - Octavehttps://wiki.octave.org/Oc…

mysql-5.7.18保姆級詳細安裝教程

本文主要講解如何安裝mysql-5.7.18數據庫&#xff1a; 將綠色版安裝包mysql-5.7.18-winx64解壓后目錄中內容如下圖&#xff0c;該例是安裝在D盤根目錄。 在mysql安裝目錄中新建my.ini文件&#xff0c;文件內容及各配置項內容如下圖&#xff0c;需要先將配置項【skip-grant-tab…

VSCode連接Github的重重困難及解決方案!

一、背景&#xff1a; 我首先在github創建了一個新的項目&#xff0c;并自動創建了readme文件其次在vscode創建項目并寫了兩個文件在我想將vscode的項目上傳到對應的github上時&#xff0c;錯誤出現了 二、報錯及解決方案&#xff1a; 1.解決方案&#xff1a; 需要在git上配置用…

YOLOV8漲點技巧之混合注意力與特征金字塔網絡融合

YOLO發展歷程 自2015年YOLOv1問世以來,這一革命性的目標檢測算法經歷了一系列重大升級。以下是YOLO各版本的主要發展里程碑: 版本 發布時間 主要開發者 YOLOv1 2015年6月 Joseph Redmon YOLOv2(YOLO9000) 2016年12月 Joseph Redmon YOLOv3 2018年4月 Joseph Redmon

數據分析:非度量多維排列 NMDS (Non-metric multidimensional scaling)ANOSIM檢驗分析

禁止商業或二改轉載,僅供自學使用,侵權必究,如需截取部分內容請后臺聯系作者! 文章目錄 介紹原理步驟加載R包數據下載導入數據數據預處理計算距離矩陣ANOSIM檢驗非度量多維排列NMDS應力值(stress value)畫圖輸出系統信息介紹 非度量多維排列(Non-metric Multidimensiona…

Open FPV VTX開源之ardupilot配置

Open FPV VTX開源之ardupilot配置 1. 源由2. 配置3. 總結4. 參考資料5. 補充5.1 飛控固件版本5.2 配置Ardupilot的BF OSD5.3 OSD偏左問題 1. 源由 飛控嵌入式OSD - ardupilot配置使用ardupliot配套OSD圖片。 Choose correct font depending on Flight Controller SW. ──>…

硬件實用技巧:TPS54331DR橫杠標識識別1引腳

若該文為原創文章&#xff0c;轉載請注明原文出處 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/145116969 長沙紅胖子Qt&#xff08;長沙創微智科&#xff09;博文大全&#xff1a;開發技術集合&#xff08;包含Qt實用技術、樹莓派、三維、OpenCV…