1. 程式人生 > >7.卡片遊戲(UVA10935)

7.卡片遊戲(UVA10935)

卡片遊戲(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; }