1437. Gasoline Station

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

 

转载于:https://www.cnblogs.com/liulangye/archive/2012/09/26/2704206.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值