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

 

posted on 2012-09-26 16:24  夜->  阅读(223)  评论(0编辑  收藏  举报