7.卡片遊戲(UVA10935)
阿新 • • 發佈:2018-11-25
卡片遊戲(UVA10935)
題目簡單分析
題目的詳細內容可以在這個網站上看到,下面簡單說明一下題目要求。
[題意]
本題主要任務是模擬一個卡牌遊戲,遊戲初始時由n張卡牌,從上到下依次為,當卡牌的數量大於1時,進行如下操作:
1.將第一張牌丟掉
2.將新的第一張牌放在最底下
要求我們依次輸出丟棄的牌的數量以及最後剩下的牌。
[輸入輸出]
Sample Input:
7
19
10
6
0
Sample Output:
Discarded cards: 1, 3, 5, 7, 4, 2 Remaining card: 6 Discarded cards: 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 4, 8, 12, 16, 2, 10, 18, 14 Remaining card: 6 Discarded cards: 1, 3, 5, 7, 9, 2, 6, 10, 8 Remaining card: 4 Discarded cards: 1, 3, 5, 2, 6 Remaining card: 4
[分析]
分析可知,本題只需要在資料的兩端進行插入和刪除且不需要進行隨機訪問,因此選擇list作為容器是最合適的。
程式碼
完整程式碼如下,C++版本為C++11,VScode的工程在github。程式碼如有bug,敬請指出。
#include <iostream>
#include <list>
using namespace std;
list<int> list1;
int num;
int next(void);
int main(){
while(cin >> num && num){//輸入
list1. clear();//清空list
for(int i=1;i<=num;++i)
list1.push_back(i);//初始化list1
cout << "Discarded cards: ";
while(true){
int ret = next();//模擬操作
//輸出
if(list1.size() >1 )
cout << ret << ", ";//最後一個不輸出", "
else {
cout << ret << endl;
break;
}
}
cout << "Remaining card: " << list1.back()<< endl;
}
return 0;
}
int next(void){
int ret=list1.front();
list1.pop_front();
list1.push_back(list1.front());
list1.pop_front();
return ret;
}