HDU5937(DFS+剪枝)
阿新 • • 發佈:2019-01-30
暴力剪枝
#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;
}