C++知識點總結(22):模擬算法真題 ★★★★☆《卡牌游戲》《移動距離》

一、卡牌游戲

1. 審題

題目描述

A , B , C A,B,C A,B,C 三人在玩一個卡牌游戲,規則如下:
游戲開始時, 3 3 3 人分別會得到若干張手牌, 每張牌上寫著 'a''b''c' 中某一個字母。手牌的順序嚴格按照輸入順序排列,不允許改變順序。
游戲從 A A A 開始出牌。如果輪到某人的回合,且這個人手上有牌,他必須出自己手上的第 1 1 1 張牌,之后輪到這張牌的寫著的字母同名的人出牌(例如出 'a' 牌之后就輪到 A A A 的回合)。
如果輪到某人的回合,且這個人手沒有牌,這個人就是贏家。
三人的起始手牌以字符串 S A S_A SA? S B S_B SB? S C S_C SC? ?的形式給出,字符串開頭是第1張牌。

輸入描述

三行,分別是字符串 S A S_A SA? S B S_B SB? S C S_C SC? ?。

輸出描述

輸出勝出者

樣例1

輸入

aca
accc
ca

輸出

A

樣例2

輸入

abcb
aacc
bbcc

輸出

C

提示

所有字符長度 < 100 <100 <100

2. 思路

2.1 暴力模擬

首先,我們應該想到的是用數組或者 string 存儲每個人手上的牌。為了更方便,我們用 string 存儲。

然后,我們就要開始模擬游戲的過程了。我們可以分析一下樣例 1 1 1 的游戲過程:

  • A A A 出牌 'a',之后輪到 A A A
  • A A A 出牌 'c',之后輪到 C C C
  • C C C 出牌 'c',之后輪到 C C C
  • C C C 出牌 'a',之后輪到 A A A
  • A A A 出牌 'a',之后輪到 A A A

此時 A A A 手上已經沒有牌了, A A A 是贏家。

最后,我們寫出初始的代碼。

2.2 技巧模擬

暴力模擬得到 T L E TLE TLE 的結果,我們嘗試換一種思路作答。

我們要定義六個變量,分別是三個人手上的牌和三個人出牌的下標。

每次出牌的時候,將出牌的下標都 + 1 +1 +1,表示應該出哪一張牌,這樣下一次出牌可以直接寫 ?[l?]

3. 參考答案

3.1 初試

#include <iostream>
#include <string>
using namespace std;string card[5];
char now;
int player;int main()
{// 輸入每個人手上的牌cin >> card[1] >> card[2] >> card[3];// 模擬打牌while (card[1] != "" && card[2] != "" && card[3] != ""){if (now == 'a'){player = 1;}if (now == 'b'){player = 2;}if (now == 'c'){player = 3;}card[player].erase(0, 1);now = card[player][0];}// 輸出最后一個玩家cout << toupper(now);return 0;
}

結果: T L E TLE TLE C P U ? T i m e ? L i m i t ? E x c e e d e d CPU-Time-Limit-Exceeded CPU?Time?Limit?Exceeded

3.2 死循環思路

#include <iostream>
#include <string>
using namespace std;string a, b, c;
int la = -1, lb = -1, lc = -1;int main()
{// 輸入每個人手上的牌cin >> a >> b >> c;// 模擬打牌la++;char card = c[la];while (true){if (card == 'a'){if (la + 1 == a.length()) // A沒有牌了{cout << "A";break;}la++;card = a[la];}else if (card == 'b'){if (lb + 1 == b.length()) // B沒有牌了{cout << "B";break;}lb++;card = b[lb];}else{if (lc + 1 == c.length()) // C沒有牌了{cout << "C";break;}lc++;card = c[lc];}}return 0;
}

結果:

AC: 90%
WA: 10%

錯誤樣例:

輸入期待輸出你的輸出
aca accc caAC

二、移動距離

題目描述

X X X 星球居民小區的樓房全是一樣的,并且按矩陣樣式排列。其樓房的編號為 1 , 2 , 3 , ? 1,2,3,? 1,2,3,?。當排滿一行時,從下一行相鄰的樓往反方向排號。
比如:當小區排號寬度為6時,開始情形如下:

1  2  3  4  5  6
12 11 10 9  8  7
13 14 15 .....

我們的問題是:已知了兩個樓號 m m m n n n,需要求出它們之間的最短移動距離。(不能斜線方向移動)

輸入描述

輸入為 3 3 3 個整數 w , m , n w,m,n w,m,n,空格分開,都在 1 1 1 1 0 4 10^4 104 范圍內。 w w w 為排號寬度 m , n m,n m,n 為待計算的樓號。

輸出描述

要求輸出一個整數,表示 m m m n n n 兩樓間最短移動距離。

樣例1

輸入

6 8 2

輸出

4

二、思路

123456
1123456
2121110987
3131415161718
4242322212019

w = 6 w=6 w=6 m ? n m-n m?n的最短移動距離,在數學中也就是求 m m m n n n 的曼哈頓距離。

也就是說,我們要將 m m m x 1 x_1 x1? y 1 y_1 y1? 求出,并將 n n n x 2 x_2 x2? y 2 y_2 y2? 求出,再做一次運算:

a n s = ∣ x 1 ? x 2 ∣ + ∣ y 1 ? y 2 ∣ ans=|x_1-x_2|+|y_1-y_2| ans=x1??x2?+y1??y2?

求行方法:

if (m % w == 0)
{x = m / w;
}
else
{x = m / w + 1;
}

求列方法:

if (x % 2 == 0) // 偶數行 右→左排列
{if (m % w == 0){y = 1;}else{y = w - m % w + 1;}
}
else // 奇數行 左→右排列
{if (m % w == 0){y = w;}else{y = m % w;}
}

3. 參考答案

#include <iostream>
#include <cmath>
using namespace std;int findx(int w, int m)
{int x;if (m % w == 0){x = m / w;}else{x = m / w + 1;}return x;
}int findy(int w, int m, int x)
{int y;if (x % 2 == 0){if (m % w == 0){y = 1;}else{y = w - m % w + 1;}}else{if (m % w == 0){y = w;}else{y = m % w;}}return y;
}int main()
{int w, m, n;int x1, y1, x2, y2;cin >> w >> m >> n;x1 = findx(w, m);x2 = findx(w, n);y1 = findy(w, m, x1);y2 = findy(w, n, x2);cout << abs(x1-x2) + abs(y1-y2);return 0;
}

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

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

相關文章

前端【技術類】資源學習網站整理(那些年的小網站)

學習網站整理 值得分享的視頻博主&#xff1a;學習網站鏈接 百度首頁的資源收藏里的截圖&#xff08;排列順序沒有任何意義&#xff0c;隨性而已~&#xff09;&#xff0c;可根據我標注的關鍵詞百度搜索到這些網站呀&#xff0c;本篇末尾會一一列出來&#xff0c;供大家學習呀 …

徹底搞懂回溯算法(例題詳解)

目錄 什么是回溯算法&#xff1a; 子集問題&#xff1a; 子集問題II(元素可重復但不可復選): 組合問題&#xff1a; 組合問題II(元素可重復但不可復選): 排列問題&#xff1a; 排列問題II(元素可重復但不可復選): 什么是回溯算法&#xff1a; 「回溯是遞歸的副產品&…

最小生成樹---Kruskal算法

最小生成樹定義&#xff1a; 給定一張邊帶權的無向圖 G(V,E)&#xff0c;其中 V 表示圖中點的集合&#xff0c;E 表示圖中邊的集合。 由 V 中的全部 n 個頂點和 E 中 n?1 條邊構成的無向連通子圖被稱為 G 的一棵生成樹&#xff0c;其中邊的權值之和最小的生成樹被稱為無向圖 G…

leetcode hot100 每日溫度

在本題中&#xff0c;我們是通過單調棧來解決的&#xff0c;因為我們采用了棧的數據結構&#xff0c;并且&#xff0c;棧內存儲的元素是單調的。 本題我們考慮&#xff0c;將氣溫數組元素的下標存入棧中&#xff0c;首先初始化要把0放入&#xff0c;0是下標的意思。然后我們拿…

華為HCIP Datacom H12-821 卷4

1.單選題 下面哪些策略或工具不能夠應用于 OSPF: A、access-list B、prefix-list C、route- Policy D、as-path filter 正確答案&#xff1a; D 解析&#xff1a; as-path-filter命令用來創建AS路徑過濾器&#xff0c;OSPF屬于IGP協議&#xff0c;不涉及到AS號。 2.單選題…

【python基礎學習05課_for循環以及雙重for循環】

FOR循環 一、認識循環-while 1、循環條件不能超出列表長度 當i 1&#xff0c;while i < len(lst1) 時&#xff0c;i 3后, 打印print&#xff08;lst[3]&#xff09;小宋老師&#xff0c; 繼續1, i 4, 4不小于 len(lst1)&#xff0c;打破循環。 2、循環條件超出列表長度報錯…

JMeter元件和采樣器一覽

Apache JMeter是一個強大的開源負載測試工具&#xff0c;用于性能和功能測試。JMeter提供了豐富的元件和采樣器&#xff0c;使得它能夠模擬復雜的測試場景和高并發的用戶請求。以下是JMeter中常用的一些元件和采樣器的介紹和講解&#xff1a; 測試計劃元件 測試計劃&#xff0…

latex報錯I was expecting a `,‘ or a `}‘的解決辦法

解決辦法——經過檢查在ref22后面缺少一個逗號 總結 當你在使用LaTeX時遇到“I was expecting a , or a }”這樣的錯誤&#xff0c;這通常意味著LaTeX在解析你的代碼時&#xff0c;預期在某個位置看到一個逗號&#xff08;,&#xff09;或一個大括號&#xff08;}&#xff09;…

每日一題 2369

2369. 檢查數組是否存在有效劃分 題目描述&#xff1a; 給你一個下標從 0 開始的整數數組 nums &#xff0c;你必須將數組劃分為一個或多個 連續 子數組。 如果獲得的這些子數組中每個都能滿足下述條件 之一 &#xff0c;則可以稱其為數組的一種 有效 劃分&#xff1a; 子數…

PTA 1010 一元多項式求導

1010 一元多項式求導 (25分) C/C - 知乎 (zhihu.com) #include<stdio.h> int main(){ int x,n; scanf("%d %d",&x,&n); if(n0)printf("%d %d",0,0); //n0 說明是常數&#xff0c;不需要求導 else printf("%d %…

STM32 串口通信

串口發原理 在stm32每個串口內部有發送寄存器和發送移位寄存器。 當調用HAL_UART_Transmit 時&#xff0c;cpu會將發送的數據放入發送寄存器中。發送移位寄存器會將數據轉換成電平的高低&#xff0c;從TX發出。 1、輪詢模式配置、發送與接收 輪詢模式時cpu會不斷檢測發送數…

嵌入式中匯編語言的基本實現

大家好&#xff0c;今天給大家分享&#xff0c;GNU匯編的語法。 第一&#xff1a;匯編簡介 GNU 匯編語法適用于所有的架構&#xff0c;并不是 ARM 獨享的&#xff0c;GNU 匯編由一系列的語句組成&#xff0c; 每行一條語句&#xff0c;每條語句有三個可選部分&#xff0c;如下…

小白學視覺 | 詳解遺傳算法 GA(Python實現代碼)

本文來源公眾號“小白學視覺”&#xff0c;僅用于學術分享&#xff0c;侵權刪&#xff0c;干貨滿滿。 原文鏈接&#xff1a;詳解遺傳算法 GA&#xff08;Python實現代碼&#xff09; 轉自&#xff1a;機器之心 英文&#xff1a;www.analyticsvidhya.com/blog/2017/07/introduc…

在線上傳解壓PHP文件代碼,壓縮/壓縮(網站一鍵打包)支持密碼登錄

在線上傳解壓PHP文件代碼&#xff0c;壓縮/壓縮(網站一鍵打包)支持密碼登錄 資源寶分享&#xff1a;www.httple.net 如果你沒有主機控制面板這個是最好選擇&#xff0c;不需要數據庫&#xff0c;上傳當控制面板使用&#xff0c;無需安裝任何擴展&#xff0c;安全高&#xff0c;…

重拾前端基礎知識:CSS

重拾前端基礎知識&#xff1a;CSS 前言選擇器簡單選擇器屬性選擇器組合選擇器 插入CSS內嵌樣式&#xff08;Inline Style&#xff09;內部樣式&#xff08;Internal Style&#xff09;外部樣式&#xff08;External Style&#xff09; 層疊顏色背景顏色文本顏色RGB 顏色HEX 顏色…

ESD管 uClamp3331ZA、AZ5A83-01B 、AZ8523-01B國產替代ESD0321CW

上海雷卯ESD二極管 ESD0321CW替代國外品牌型號uClamp3331ZA、AZ5A83-01B 、AZ8523-01B&#xff0c;參數對比如下&#xff1a; 判斷ESD二極管是否可以替代需注意的幾點&#xff1a; 1. VRWM 是否接近 2. 抗靜電能力是否接近&#xff1b; 3. VBR 是否接近&#xff1b; 4. IPP…

【小程序】首屏渲染優化

小程序首屏渲染優化對于提升用戶體驗以及減少用戶等待時間非常重要。下面我們來詳細解析小程序首屏渲染優化的相關技巧和方法&#xff0c;并結合代碼示例進行分析。 首先&#xff0c;我們需要了解小程序的渲染流程。小程序的渲染過程可以分為兩個階段&#xff1a;解析階段和布局…

Julia語言中的位運算符、賦值運算符、算術運算符

算術運算符 # 使用基本的賦值運算符 a 10 println("a 的初始值是: $a") # 使用加法賦值運算符 a 5 println("a 加上 5 后的值是: $a") # 使用減法賦值運算符 - a - 3 println("a 減去 3 后的值是: $a") # 使用乘法賦值運算符…

Mistral發布語言大模型Mistral Large;法國新星Mistral挑戰 OpenAI 霸主地位

&#x1f989; AI新聞 &#x1f680; Mistral發布語言大模型Mistral Large 摘要&#xff1a;Mistral Large 是 Mistral AI 公司最新發布的旗艦語言模型&#xff0c;具備頂尖水平的推理能力。它主要被設計用于處理復雜的多語言推理任務&#xff0c;比如文本理解、轉換和代碼生…

上位機圖像處理和嵌入式模塊部署(上、下位機通信的三個注意點)

【 聲明&#xff1a;版權所有&#xff0c;歡迎轉載&#xff0c;請勿用于商業用途。 聯系信箱&#xff1a;feixiaoxing 163.com】 如果最終部署在客戶現場的是一個嵌入式設備&#xff0c;那么上位機在做好了算法編輯和算法部署之后&#xff0c;很重要的一步就是處理上位機和下位…