熱門文章

2025年10月17日 星期五

ZeroJudge 解題筆記:f647. 撲克牌

作者:王一哲
日期:2025年10月17日


ZeroJudge 題目連結:f647. 撲克牌

解題想法


我用串列儲存牌組,先用 for 迴圈産生按照花色、數字排列好的 52 張牌,接下來依照指令用串列切片修改內容。

Python 程式碼


使用時間約為 0.4 s,記憶體約為 3.4 MB,通過測試。
deck = [""]*52
suits = ('S', 'H', 'D', 'F')
akqj = {1: 'A', 13: 'K', 12: 'Q', 11: 'J'}
for i in range(4):
    for j in range(1, 14):
        if 2 <= j <= 10: deck[i*13 +j-1] = suits[i] + str(j)
        else: deck[i*13 + j-1] = suits[i] + akqj[j]
n = int(input())
for _ in range(n):
    line = input().split()
    if line[0] == '1':
        a, b = int(line[1])-1, int(line[2])-1
        deck = deck[a:b+1] + deck[:a] + deck[b+1:]
    elif line[0] == '2':
        a, b = int(line[1])-1, int(line[2])-1
        deck = deck[:a] + deck[b+1:] + deck[a:b+1]
    elif line[0] == '3':
        k = int(line[1])
        deck = deck[52-k:] + deck[:52-k]
    else:
        k = int(line[1])
        deck = deck[k:] + deck[:k]
print(*deck[:5])


C++ 程式碼


使用時間約為 0.3 s,記憶體約為 380 kB,通過測試。
#include <iostream>
#include <vector>
#include <string>
#include <map>
#include <algorithm>
using namespace std;

int main() {
    ios::sync_with_stdio(0); cin.tie(0);
    vector<string> deck (52);
    string suits[4] = {"S", "H", "D", "F"};
    map<int, string> akqj = {{1, "A"}, {13, "K"}, {12, "Q"}, {11, "J"}};
    for(int i=0; i<4; i++) {
        for(int j=1; j<=13; j++) {
            if (j >= 2 && j <= 10) deck[i*13 +j-1] = suits[i] + to_string(j);
            else deck[i*13 + j-1] = suits[i] + akqj[j];
        }
    }
    int n; cin >> n;
    for(int i=0; i<n; i++) {
        string cmd; cin >> cmd;
        if (cmd == "1") {
            int a, b; cin >> a >> b;
            a--; b--;
            vector<string> tmp (deck.begin()+a, deck.begin()+b+1);
            tmp.insert(tmp.end(), deck.begin(), deck.begin()+a);
            tmp.insert(tmp.end(), deck.begin()+b+1, deck.end());
            deck = tmp;
        } else if (cmd == "2") {
            int a, b; cin >> a >> b;
            a--; b--;
            vector<string> tmp (deck.begin(), deck.begin()+a);
            tmp.insert(tmp.end(), deck.begin()+b+1, deck.end());
            tmp.insert(tmp.end(), deck.begin()+a, deck.begin()+b+1);
            deck = tmp;
        } else if (cmd == "3") {
            int k; cin >> k;
            vector<string> tmp (deck.end()-k, deck.end());
            tmp.insert(tmp.end(), deck.begin(), deck.end()-k);
            deck = tmp;
        } else {
            int k; cin >> k;
            vector<string> tmp (deck.begin()+k, deck.end());
            tmp.insert(tmp.end(), deck.begin(), deck.begin()+k);
            deck = tmp;
        }
    }
    for(int i=0; i<5; i++) cout << deck[i] << " \n"[i == 4];
    return 0;
}


沒有留言:

張貼留言