非常可乐 HDU1495

#include<iostream>
#include<algorithm>
#include<math.h>
#include<stdlib.h>
#include<string.h>
#include<stdio.h>
#include<ctype.h>
#include<limits.h>
#include<queue>
#include<stack>
using namespace std;
#define max(a, b) a>b?a:b
#define min(a, b) a<b?a:b
#define N 110
typedef struct maze
{
    int a, b, c, step;
} MAZE;
int s, n, m, visit[N][N][N];
void BFS();
int main()
{
    while(scanf("%d%d%d", &s, &n, &m), s+n+m)
    {
        if(s%2!=0)
            printf("NO\n");
        else
            BFS();
    }
    return 0;
}
void BFS()
{
    queue<MAZE>que;
    memset(visit, 0, sizeof(visit));
    MAZE p, q;
    p.a=s;
    p.b=0;
    p.c=0;
    p.step=0;
    visit[p.a][p.b][p.c]=1;
    que.push(p);
    while(!que.empty())
    {
        p=que.front();
        que.pop();
        if((p.a==p.b&&p.c==0)||(p.a==p.c&&p.b==0)||(p.b==p.c&&p.a==0))
        {
            printf("%d\n", p.step);
            return;
        }
        q=p;
        if(p.a!=0)
        {
            if(p.a>n-p.b)//也就是说p.a还有剩余
            {
                //q= (MAZE) {p.a-n+p.b, n, p.c, p.step+1};
                q.a=p.a-n+p.b;
                q.b=n;
                q.c=p.c;
                q.step=p.step+1;
            }
            else
            {
                //q= (MAZE) {0, p.a+p.b, p.c, p.step+1};
                q.a=0;
                q.b=p.a+p.b;
                q.c=p.c;
                q.step=p.step+1;
            }
            if(visit[q.a][q.b][q.c]==0)
            {
                visit[q.a][q.b][q.c]=1;
                que.push(q);
            }
            if(p.a>m-p.c)//也就是说p.a还有剩余
            {
                // q=(MAZE) {p.a-m+p.c, p.b, m, p.step+1};
                q.a=p.a-m+p.c;
                q.b=p.b;
                q.c=m;
                q.step=p.step+1;
            }
            else
            {
                // q= (MAZE) {0, p.b, p.c+p.a, p.step+1};
                q.a=0;
                q.b=p.b;
                q.c=p.c+p.a;
                q.step=p.step+1;
            }
            if(visit[q.a][q.b][q.c]==0)
            {
                visit[q.a][q.b][q.c]=1;
                que.push(q);
            }
        }
        if(p.b!=0)
        {
            if(p.b>s-p.a)//也就是说p.b还有剩余
            {
                //q= (MAZE) {s, p.b-s+p.a, p.c, p.step+1};
                q.a=s;
                q.b=p.b-s+p.a;
                q.c=p.c;
                q.step=p.step+1;
            }
            else
            {
                //q= (MAZE) {p.a+p.b, 0, p.c, p.step+1};
                q.a=p.a+p.b;
                q.b=0;
                q.c=p.c;
                q.step=p.step+1;
            }
            if(visit[q.a][q.b][q.c]==0)
            {
                visit[q.a][q.b][q.c]=1;
                que.push(q);
            }
            if(p.b>m-p.c)//也就是说p.b还有剩余
            {
                //q= (MAZE) {p.a, p.b-m+p.c, m, p.step+1};
                q.a=p.a;
                q.b=p.b-m+p.c;
                q.c=m;
                q.step=p.step+1;
            }
            else
            {
                // q= (MAZE) {p.a, 0, p.c+p.b, p.step+1};
                q.a=p.a;
                q.b=0;
                q.c=p.c+p.b;
                q.step=p.step+1;
            }
            if(visit[q.a][q.b][q.c]==0)
            {
                visit[q.a][q.b][q.c]=1;
                que.push(q);
            }
        }
        if(p.c!=0)
        {
            if(p.c>s-p.a)//也就是说p.c还有剩余
            {
                //q= (MAZE) {s, p.b, p.c-s+p.a, p.step+1};
                q.a=s;
                q.b=p.b;
                q.c=p.c-s+p.a;
                q.step=p.step+1;
            }
            else
            {
                // q= (MAZE) {p.a+p.c, p.b, 0. p.step+1};
                q.a=p.a+p.c;
                q.b=p.b;
                q.c=0;
                q.step=p.step+1;
            }
            if(visit[q.a][q.b][q.c]==0)
            {
                visit[q.a][q.b][q.c]=1;
                que.push(q);
            }
            if(p.c>n-p.b)//也就是说p.c 还有剩余
            {
                //q= (MAZE) {p.a, n, p.c+p.b-n, p.step+1};
                q.a=p.a;
                q.b=n;
                q.c=p.c+p.b-n;
                q.step=p.step+1;
            }
            else
            {
                //q= (MAZE){p.a, p.b+p.c, 0, p.step+1};
                q.a=p.a;
                q.b=p.b+p.c;
                q.c=0;
                q.step=p.step+1;
            }
            if(visit[q.a][q.b][q.c]==0)
            {
                visit[q.a][q.b][q.c]=1;
                que.push(q);
            }
        }
    }
    printf("NO\n");
}
时间: 2024-12-20 16:20:36

非常可乐 HDU1495的相关文章

HDU1495 非常可乐

问题链接:HDU1495 非常可乐. 题意简述:平分液体问题.输入s.n和m三个数,分别代表可乐和2个杯子,三个容器可以互相倒,问能不能把s中的可乐平分,能的话输出最小倒杯子的次数,不能就输出NO. 问题分析:开始的时候,所有可乐在s中,2个杯子n和m都空着.过程中,可以将任何1个容器中的可乐倒到另外某个容器中,或将目标容器倒满,或将源容器倒空.因为容器没有刻度,只能这样.这个过程中,如果出现某个容器空,另外2个容器可乐相同则成功.如果开始的时候,可乐的容量是奇数,则不可能平分可乐.容器间可乐倒

HDU1495 非常可乐 【BFS】

非常可乐 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4832    Accepted Submission(s): 1944 Problem Description 大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为.因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要

hdu1495非常可乐

大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为.因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和seeyou一样多.但seeyou的手中只有两个杯子,它们的容量分别是N 毫升和M 毫升 可乐的体积为S (S<101)毫升 (正好装满一瓶) ,它们三个之间可以相互倒可乐 (都是没有刻度的,且 S==N+M,101>S>0,N>0,M>0) .聪明的ACMER你们说他们能平分吗?如果能请输出倒可乐的最少的

HDU-1495 非常可乐 (嵌套结构体-广搜 对比 一般广搜)

题意 大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为.因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和seeyou一样多.但seeyou的手中只有两个杯子,它们的容量分别是N 毫升和M 毫升 可乐的体积为S (S<101)毫升 (正好装满一瓶) ,它们三个之间可以相互倒可乐 (都是没有刻度的,且 S==N+M,101>S>0,N>0,M>0) .聪明的ACMER你们说他们能平分吗?如果能请输出倒可乐的

hdu1495 非常可乐(bfs)

Problem Description 大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为.因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和seeyou一样多.但seeyou的手中只有两个杯子,它们的容量分别是N 毫升和M 毫升 可乐的体积为S (S<101)毫升 (正好装满一瓶) ,它们三个之间可以相互倒可乐 (都是没有刻度的,且 S==N+M,101>S>0,N>0,M>0) .聪明的ACMER你们说

【HDU - 1495】非常可乐

-->非常可乐  Descriptions: 大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为.因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和seeyou一样多.但seeyou的手中只有两个杯子,它们的容量分别是N 毫升和M 毫升 可乐的体积为S (S<101)毫升 (正好装满一瓶) ,它们三个之间可以相互倒可乐 (都是没有刻度的,且 S==N+M,101>S>0,N>0,M>0) .聪明的AC

HDOJ 1495 非常可乐 【BFS】

非常可乐 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5954    Accepted Submission(s): 2428 Problem Description 大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为.因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要

HDU 1495 非常可乐(数论,BFS)

非常可乐 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 14153    Accepted Submission(s): 5653 Problem Description 大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为.因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定

hdoj 1495 非常可乐(bfs)

非常可乐 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 7194    Accepted Submission(s): 2865 Problem Description 大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为.因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝