1 条题解

  • 0
    @ 2025-5-8 20:46:28
    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cstdlib>
    #include <algorithm>
    #include <cmath>
    using namespace std;
    
    int card[5];
    int temp[5];
    int readchar()
    {
        int t;
        while (t=getchar())
        {
            if (isdigit(t) || isalpha(t)) break;
        }
        return t;
    }
    
    const char VALUES[] = " A234567890JQK";
    const char SUITS[] = " CDHS";
    int _turn(int x, bool is_in, bool is_value)
    {
        if (is_in)
        {
            if (x == '1')
            {
                getchar();
                return 100;
            }
            for (int i = 1; VALUES[i] != '\0'; i++)
            {
                if (VALUES[i] == x) return i*10;
            }
            for (int i = 1; SUITS[i] != '\0'; i++)
            {
                if (SUITS[i] == x) return i;
            }
        }
        else 
        {
            if (is_value)
            {
                if (x == 10) putchar('1');
                return VALUES[x];
            }
            else return SUITS[x];
        }
    }
    void readcard()
    {
        int t;
        for (int i = 0; i < 5; i++)
        {
            card[i] += _turn(readchar(), true, false);
            card[i] += _turn(readchar(), true, false);
        }
    }
    
    bool is_ok(int t[],int &d)
    {
        d = t[0]-t[1];
        if (d % 10) return false;           // the same suit
    
        d /= 10;
        if (d < 0) d += 13;
        if (d >= 1 && d <= 6) return true;
        else return false;
    }
    
    void _print(int t[], int d, int kase)
    {
        if ((d-1) % 3 == 1)
        {
            swap(t[2], t[3]);
        }
        else if ((d-1) % 3 == 2)
        {
            swap(t[2], t[4]);
            if (d == 3) swap(t[2], t[3]);
        }
        if (d == 4) swap(t[3], t[4]);
        if (d == 5) swap(t[2], t[4]);
    
        printf("Problem %d:", kase);
        for (int i = 0; i < 5; i++)
        {
            putchar(' ');
            putchar(_turn(t[i]/10, false, true));
            putchar(_turn(t[i]%10, false, false));
        }
        putchar('\n');
    }
    int main()
    {
        int T;
        int kase = 0;
        scanf("%d", &T);
        while (++kase <= T)
        {
            bool mark = false;
            memset(card, 0, sizeof(card));
            readcard();
            sort(card, card+5);
            for (int i = 0; i < 5 && !mark; i++)
                for (int j = 0; j < 5 && !mark; j++)
                {
                    if (i == j) continue;
                    int cnt = 2;
                    for (int k = 0; k < 5; k++)
                    {
                        if (k == i) temp[0] = card[i];
                        else if (k == j) temp[1] = card[j];
                        else temp[cnt++] = card[k]; 
                    }
                    int d;
                    if(is_ok(temp, d))
                    {
                        _print(temp, d, kase);
                        mark = true;
                    }
                }
        }
        return 0;
    } 
    
    1. 输入处理

      • 使用 readchar 函数读取输入的字符,跳过非数字和非字母的字符,获取纸牌的字符表示。
      • 通过 _turn 函数将纸牌的字符表示转换为内部的数值表示,例如将 'A' 转换为 10'C' 转换为 1 等,方便后续计算。
      • 使用 readcard 函数读取 5 张纸牌的数值表示并存储在 card 数组中。
    2. 排序与组合尝试

      • card 数组进行排序,以便后续处理。
      • 遍历所有可能的两张纸牌组合,一张作为交给观众的纸牌,另一张作为第一张交给魔术师的纸牌,其余三张作为后续交给魔术师的纸牌。
    3. 检查组合是否符合规则

      • 使用 is_ok 函数检查当前组合是否符合规则。该函数计算第一张纸牌和第二张纸牌的差值,并根据差值判断是否满足条件:差值应是 10 的倍数(表示同花色),且差值在 1 到 6 之间(经过处理后的差值)。
      • 如果当前组合符合规则,则记录下该组合,并设置标记 marktrue
    4. 调整纸牌顺序并输出

      • 如果找到符合规则的组合,使用 _print 函数对后续交给魔术师的三张纸牌进行顺序调整。调整规则基于差值 d,根据 d 的不同值进行不同的交换操作。
      • 最后按照指定格式输出结果,包括问题编号和调整后的纸牌顺序。

    总体而言,代码通过对所有可能的纸牌组合进行尝试和检查,找到符合魔术规则的组合,并对纸牌顺序进行调整后输出。

    • 1

    信息

    ID
    1201
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者