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;

}



 

你可能感兴趣的:(IO)