csp 201609-3 爐石傳說
本題給出了爐石傳說這個遊戲的部分規則,主要是說場上有兩名玩家,每位玩家由一張英雄卡和七張角色卡位。初始時英雄有30點生命和0點攻擊,由先手開始,每個回合可以執行若干次以下三種操作:
召喚隨從:玩家召喚乙個隨從進入戰場,隨從具有指定的生命值和攻擊力。
隨從攻擊:玩家控制自己的某個隨從攻擊對手的英雄或者某個隨從。
結束回合:玩家宣告自己的當前回合結束,遊戲將進入對手的回合。該操作一定是乙個回合的最後乙個操作。
隨從攻擊時攻擊者和被攻擊者均受到對方攻擊力點數的傷害。當場上任一方英雄生命值小於等於零時(生命值可為負),此時不再進行其餘操作,遊戲結束。現在要求輸出最終遊戲結果,同時給出兩位英雄剩餘生命值和各自剩餘隨從數及其生命值。
注意隨從死亡和插入隨從均需要保證隨從編號從1~n連續,這也是本題要處理的乙個關鍵點。
本題是一道模擬體,總體難度不大,但是需要用到vector中的內容,便於實現戰鬥過程中的複雜操作。如果不使用vector自帶的操作,很有可能會出現許多小問題,且**複雜。之前第一次嘗試時就是因為**太過複雜導致查錯困難,卡在了90分,使用vector對於這種複雜模擬就比較有優勢。
本題讀懂題後可以發現題意其實很簡單,只要記錄每個人當前所有手牌的攻擊力和生命值狀態,再按要求進行相應的攻擊操作。如果隨從被擊敗就直接替換下,將他後面的隨從編號依次向前移動。最終觀察哪一方英雄生命值小於等於零,則對方自然就是勝者。這裡需要注意的是插入隨從和刪除隨從,vector自帶的insert和erase函式可以完成。
綜上所述,本題關鍵是要理解題意,讀懂題目,隨後用簡潔明瞭的**實現,**過於冗長也會造成不必要的麻煩。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long
#define maxn 30005
#define inf 1e9
using
namespace std;
struct node};
vector follow[2]
;int
main()
else
if(op ==
"attack")if
(follow[
!flag]
[b].health <=
0&& b !=0)
}else
if(op ==
"end")}
if(follow[0]
[0].health >
0&& follow[1]
[0].health >0)
else
if(follow[0]
[0].health >0)
else
if(follow[1]
[0].health >0)
cout << follow[0]
[0].health << endl;
cout << follow[0]
.size()
-1<<
" ";
for(
int i =
1; i < follow[0]
.size()
; i++
) cout << endl;
cout << follow[1]
[0].health << endl;
cout << follow[1]
.size()
-1<<
" ";
for(
int i =
1; i < follow[1]
.size()
; i++
) cout << endl;
return0;
}
CSP201609 3爐石傳說
首先根據題意,有兩個玩家角色,每個角色有乙個英雄以及至多7個隨從,可以進行召喚隨從和攻擊對方的操作,我認為本題關鍵在於資料的儲存以及理解,因為題目要求任意時刻,戰場上的隨從總是從1開始連續編號。召喚新的隨從時原來該位置及右邊的所有隨從編號都會增加 1。而當乙個隨從死亡時,它右邊的所有隨從編號都會減少...
CSP 201609 3 爐石傳說
試題編號 201609 3 試題名稱 爐石傳說 時間限制 1.0s 記憶體限制 256.0mb 爐石傳說 魔獸英雄傳 hearthstone heroes of warcraft,簡稱爐石傳說 是暴雪娛樂開發的一款集換式卡牌遊戲 如下圖所示 遊戲在乙個戰鬥棋盤上進行,由兩名玩家輪流進行操作,本題所使...
csp 201609 3 爐石傳說
試題編號 201609 3 試題名稱 爐石傳說 時間限制 1.0s 記憶體限制 256.0mb 問題描述 這裡使用暴力模擬的辦法,設定乙個結構體servent來表示英雄和隨從,為兩名選手各給乙個容量為8的servent陣列,其中0號位置代表英雄,其他位置可放置隨從,並設定乙個位置計數,表示最後乙個放...