http://acm.timus.ru/problem.aspx?space=1&num=1437
好水的数据呀 dfs 都能过
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <queue> #include <vector> #include <algorithm> #define LL long long //#pragma comment(linker, "/STACK:1024000000,1024000000") using namespace std; const int N=256; bool visited[N][N][N]; bool have[N*3]; int K1,K2,K3; int ans; void Addans(int k1,int k2,int k3) { if(!have[k1]) {have[k1]=true;++ans;} if(!have[k2]) {have[k2]=true;++ans;} if(!have[k3]) {have[k3]=true;++ans;} if(!have[k1+k2]) {have[k1+k2]=true;++ans;} if(!have[k1+k3]) {have[k1+k3]=true;++ans;} if(!have[k3+k2]) {have[k3+k2]=true;++ans;} if(!have[k3+k2+k1]) {have[k3+k2+k1]=true;++ans;} } void dfs(int k1,int k2,int k3) { visited[k1][k2][k3]=true; Addans(k1,k2,k3); if(!visited[K1][k2][k3]) dfs(K1,k2,k3); if(!visited[k1][K2][k3]) dfs(k1,K2,k3); if(!visited[k1][k2][K3]) dfs(k1,k2,K3); int temp; temp=min(K1-k1,k2); if(!visited[k1+temp][k2-temp][k3]) dfs(k1+temp,k2-temp,k3); temp=min(k1,K2-k2); if(!visited[k1-temp][k2+temp][k3]) dfs(k1-temp,k2+temp,k3); temp=min(K1-k1,k3); if(!visited[k1+temp][k2][k3-temp]) dfs(k1+temp,k2,k3-temp); temp=min(k1,K3-k3); if(!visited[k1-temp][k2][k3+temp]) dfs(k1-temp,k2,k3+temp); temp=min(K2-k2,k3); if(!visited[k1][k2+temp][k3-temp]) dfs(k1,k2+temp,k3-temp); temp=min(k2,K3-k3); if(!visited[k1][k2-temp][k3+temp]) dfs(k1,k2-temp,k3+temp); } int main() { //freopen("data.txt","r",stdin); scanf("%d %d %d",&K1,&K2,&K3); ans=0; memset(visited,false,sizeof(visited)); memset(have,false,sizeof(have)); dfs(0,0,0); printf("%d\n",ans-1); return 0; }