1 条题解
-
0
#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; }
-
输入处理:
- 使用
readchar
函数读取输入的字符,跳过非数字和非字母的字符,获取纸牌的字符表示。 - 通过
_turn
函数将纸牌的字符表示转换为内部的数值表示,例如将'A'
转换为10
,'C'
转换为1
等,方便后续计算。 - 使用
readcard
函数读取 5 张纸牌的数值表示并存储在card
数组中。
- 使用
-
排序与组合尝试:
- 对
card
数组进行排序,以便后续处理。 - 遍历所有可能的两张纸牌组合,一张作为交给观众的纸牌,另一张作为第一张交给魔术师的纸牌,其余三张作为后续交给魔术师的纸牌。
- 对
-
检查组合是否符合规则:
- 使用
is_ok
函数检查当前组合是否符合规则。该函数计算第一张纸牌和第二张纸牌的差值,并根据差值判断是否满足条件:差值应是 10 的倍数(表示同花色),且差值在 1 到 6 之间(经过处理后的差值)。 - 如果当前组合符合规则,则记录下该组合,并设置标记
mark
为true
。
- 使用
-
调整纸牌顺序并输出:
- 如果找到符合规则的组合,使用
_print
函数对后续交给魔术师的三张纸牌进行顺序调整。调整规则基于差值d
,根据d
的不同值进行不同的交换操作。 - 最后按照指定格式输出结果,包括问题编号和调整后的纸牌顺序。
- 如果找到符合规则的组合,使用
总体而言,代码通过对所有可能的纸牌组合进行尝试和检查,找到符合魔术规则的组合,并对纸牌顺序进行调整后输出。
-
- 1
信息
- ID
- 1201
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者