CF208B Solitaire 题解
Solution:
观察题目数据范围,显而易见本题一定是深度优先搜索。
设计状态的时候注意只要后面三维就行了。
设计完状态就是入门的暴搜了。
Code:
#include <cstdio>
#include <cstring>
struct Card {
int v, s;
};
int n;
Card c[52];
int can[52][52][52][52];
bool check(int c1, int c2) {
return c[c1].v == c[c2].v || c[c1].s == c[c2].s;
}
bool gao(int p, int c1, int c2, int c3) {
if (p == 0) {
return true;
} else if (p == 1) {
return check(c1, c2);
}
if (can[p][c1][c2][c3] == -1) {
int& t = can[p][c1][c2][c3] = 0;
if (check(c1, c2) && gao(p - 1, c1, c3, p - 3)) {
t = 1;
} else if (p >= 3 && check(c1, p - 3) && gao(p - 1, c2, c3, c1)) {
t = 1;
}
}
return can[p][c1][c2][c3] == 1;
}
bool gao() {
if (n == 1) {
return true;
} else if (n == 2) {
return check(0, 1);
}
memset(can, -1, sizeof(can));
return gao(n - 1, n - 1, n - 2, n - 3);
}
int main() {
scanf("%d", &n);
for (int i = 0; i < n; ++i) {
char buf[3];
scanf("%s", buf);
char ch = buf[0];
if (ch >= '2' && ch <= '9') {
c[i].v = ch - '0';
} else {
c[i].v = ch == 'T' ? 10 : ch == 'J' ? 11 : ch == 'Q' ? 12 : ch == 'K' ? 13 : 1;
}
ch = buf[1];
c[i].s = ch == 'S' ? 0 : ch == 'D' ? 1 : ch == 'H' ? 2 : 3;
}
puts(gao() ? "YES" : "NO");
return 0;
}