hust 1425【DFS】

http://acm.hust.edu.cn/thx/problem.php?id=1425

 

再次orz青蛙牛&菊神的神思路,已经把DFS理解得出神入化

思路:首先要知道

(x1,y1,z1)
(x2,y2,z2)
(x3,y3,z3)
的结果除以3取模,和
(x1%3,y1%3,z1%3)
(x2%3,y2%3,z2%3)
(x3%3,y3%3,z3%3)
的结果除以3取模
是一样的,然后因为abc可能是负数,负数%3=负数或0。

用cnt数组记录同类的有多少,然后DFS。。。额,比较难说清,看代码吧。总之很神!

#include <iostream> #include <stdio.h> #include <string.h> using namespace std; typedef long long LL; int cnt[3][3][3]; int tmp[30]; int x[4],y[4],z[4]; LL cc[4]; LL res; int cal(){ return x[1]*y[2]*z[3]+x[2]*y[3]*z[1]+x[3]*y[1]*z[2] -x[3]*y[2]*z[1]-x[2]*y[1]*z[3]-x[1]*y[3]*z[2]; } void DFS(int depth) { if (depth == 4) { if (cal()%3 == 0) { res = res + cc[1]*cc[2]*cc[3]; } return ; } int i,j,k; for (i=0; i<=2; ++i){ for (j = 0; j <= 2; ++j){ for (k = 0; k <= 2 ; ++k){ if (cnt[i][j][k]){ cc[depth] = cnt[i][j][k]; cnt[i][j][k]--; x[depth]=i; y[depth]=j; z[depth]=k; DFS(depth+1); cnt[i][j][k]++; } } } } } int main() { //freopen("a.txt","r",stdin); int t,cas = 0; scanf ("%d", &t); while (t --) { int n; cas++; scanf ("%d", &n); memset(cnt, 0,sizeof (cnt)); for (int i = 0; i < n; i ++) { int a, b, c; scanf ("%d%d%d", &a, &b, &c); cnt[(a % 3 + 3) % 3][(b % 3 + 3) % 3][(c % 3 + 3) % 3] ++; } res = 0; DFS(1); printf("Case #%d: ",cas); printf("%lld/n",res); } return 0; }

你可能感兴趣的:(c)