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;
}