diff --git a/Luogu/P3154/P3154.cpp b/Luogu/P3154/P3154.cpp new file mode 100644 index 00000000..7c5b652e --- /dev/null +++ b/Luogu/P3154/P3154.cpp @@ -0,0 +1,108 @@ +#include +#include + +const int N = 10; + +int n, a[N], s[N], ans; + +template +void read(T& x) { + x = 0; + char c = getchar(); + int f = 1; + + while (!isdigit(c)) { + if (c == '-') f = -1; + c = getchar(); + } + + while (isdigit(c)) { + x = x * 10 + (c - '0'); + c = getchar(); + } + + x *= f; +} + +void dfs(int x, int y) { + // 当前得分已经大于最终得分 + if (s[x] > a[x]) return; + + // 如果以后的比赛全赢也小于最后的分数 + if (s[x] + (n - y + 1) * 3 < a[x]) return; + + if (x == n && s[x] == a[x]) { + ans++; + return; + } + + if (y == n) { + int t = a[x] - s[x]; + + // 最后一场比赛无法凑出 2 分 + switch (t) { + case 0: { + s[y] += 3; + dfs(x + 1, x + 2); + s[y] -= 3; + + break; + } + + case 1: { + s[x] += 1; + s[y] += 1; + dfs(x + 1, x + 2); + s[x] -= 1; + s[y] -= 1; + + break; + } + + case 3: { + s[x] += 3; + dfs(x + 1, x + 2); + s[x] -= 3; + + break; + } + } + + return; + } + + // x 胜 + s[x] += 3; + s[y] += 0; + dfs(x, y + 1); + s[x] -= 3; + s[y] -= 0; + + // 平局 + s[x] += 1; + s[y] += 1; + dfs(x, y + 1); + s[x] -= 1; + s[y] -= 1; + + // y 胜 + s[x] += 0; + s[y] += 3; + dfs(x, y + 1); + s[x] -= 0; + s[y] -= 3; +} + +int main() { + read(n); + + for (int i = 1; i <= n; i++) { + read(a[i]); + } + + dfs(1, 2); + + printf("%d\n", ans); + + return 0; +}