1. 程式人生 > >HDU5937(DFS+剪枝)

HDU5937(DFS+剪枝)

暴力剪枝

#include <bits/stdc++.h>

using namespace std;

#define rep(i, a, b)    for (int i(a); i <= (b); ++i)
#define dec(i, a, b)    for (int i(a); i >= (b); --i)

typedef long long LL;

struct node{
    int x, y, z;
} c[105];
int et = 0;
int f[11];
int a[11];
int ans;
int T;
int ca = 0;
vector
<int>
v; void dfs(int x, int cnt){ if (cnt + et - x + 1 <= ans) return; if (x > et){ ans = max(ans, cnt); return; } dfs(x + 1, cnt); --a[c[x].x]; --a[c[x].y]; --a[c[x].z]; if (a[c[x].x] >= 0 && a[c[x].y] >= 0 && a[c[x].z] >= 0
){ dfs(x + 1, cnt + 1); ++a[c[x].x]; ++a[c[x].y]; ++a[c[x].z]; } else{ ++a[c[x].x]; ++a[c[x].y]; ++a[c[x].z]; } } int main(){ rep(i, 1, 9) rep(j, 1, 9) rep(k, 1, 9){ if (i + j == k){ ++et; c[et].x = i; c[et].y = j; c[et].z = k; ++f[i], ++f[j], ++f[k]; } } scanf
("%d", &T); while (T--){ printf("Case #%d: ", ++ca); rep(i, 1, 9) scanf("%d", a + i); bool fl = true; rep(i, 1, 9) if (a[i] < f[i]){ fl = false; break; } if (fl){ printf("%d\n", et); continue; } ans = 0; dfs(1, 0); printf("%d\n", ans); } return 0; }