其实题目本身的描述有一些迷惑性。我来阐述一些性质:
- 因为对于所有的x,有且只有4张点数为x的牌;所以每一堆牌最多会被抽四次,即已经被翻开的牌不会被抽到。
- 因为要使一堆牌(非第13堆)被抽到,必然是在其他堆中抽到了一张编号为这堆的牌,那么这一堆中就至少有一张编号为其他堆的牌,所以“有进有出”,因此每一次抽牌一定始于“生命堆”,终于一张K。
- 所有抽到的非K牌都正面朝上,所有正面朝上的同点数牌一定在一起。
由于这些性质,其实不需要什么双端队列储存,直接抽完一张牌就扔掉,再统计一下每一种点数的牌被抽到几次,如果有一种牌被抽到4次,给答案加一即可。
#include <bits/stdc++.h>
using namespace std;
int a[20][10];
int p[20], tot[20];
int main(void) {
for (int i = 1; i <= 13; ++i) {
for (int j = 4; j >= 1; --j) {
char ch;
cin >> ch;
if (ch >= '2' && ch <= '9') {
a[i][j] = ch - '0';
}
if (ch == 'A') {
a[i][j] = 1;
}
if (ch == '0') {
a[i][j] = 10;
}
if (ch == 'J') {
a[i][j] = 11;
}
if (ch == 'Q') {
a[i][j] = 12;
}
if (ch == 'K') {
a[i][j] = 13;
}
}
}
while (tot[13] < 4) {
int now = a[13][++p[13]];
++tot[now];
while (now != 13) {
now = a[now][++p[now]];
++tot[now];
}
}
int res = 0;
for (int i = 1; i <= 12; ++i) {
if (tot[i] == 4) {
++res;
}
}
cout << res << endl;
return 0;
}
膜拜大佬
太妙了