非常可乐---hdu 1495(BFS)

http://acm.hdu.edu.cn/showproblem.php?pid=1495

题意:

有3个杯子a b c;a=b+c;然后刚开始时只有a是满的,其它为空的,然后a b c三个之间互相倒,假如说a倒入b中,只有当b满或a空时,才算倒一次;

a=4,b=1;c=3;

因为刚开始只有a中有;

先让a倒入c中3;step++;

c倒入b中1;step++;

b倒入a中1;step++;此时a和c中各有2;

代码如下:

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<queue>
#include<cmath>
#define N 120
using namespace std;

struct node
{
    int a,b,c,step;
    friend bool operator<(node a,node b)
    {
        return a.step>b.step;
    }
};
int vis[N][N][N];
int BFS(int a,int b,int c)
{
    node q,p;
    priority_queue<node>Q;
    memset(vis,0,sizeof(vis));
    p.a=a;p.b=0;p.c=0;p.step=0;
    vis[p.a][p.b][p.c]=1;
    Q.push(p);
    while(!Q.empty())
    {
        q=Q.top();
        Q.pop();
        if((q.a==a/2&&q.b==a/2)||(q.b==a/2&&q.c==a/2)||(q.a==a/2&&q.c==a/2) )
            return q.step;
        if(q.a!=0)//a->其他;
        {
            if(q.a<=b-q.b)//a->b;如果a中的全都能倒到b中;
            {
                p.a=0;
                p.b=a-q.c;
                p.c=q.c;
                p.step=q.step+1;
            }
            else//a不能全到完;因为b满了;
            {
                p.a=a-b-q.c;
                p.b=b;
                p.c=q.c;
                p.step=q.step+1;
            }
            if(vis[p.a][p.b][p.c]==0)
            {
                vis[p.a][p.b][p.c]=1;
                Q.push(p);
            }

            //以下同理;
            if(q.a<=b-q.c)//a->c;如果a中的全都能倒到c中;
            {
                p.a=0;
                p.b=q.b;
                p.c=a-q.b;
                p.step=q.step+1;
            }
            else//a不能全到完;因为c满了;
            {
                p.a=a-c-q.b;
                p.b=q.b;
                p.c=c;
                p.step=q.step+1;
            }
            if(vis[p.a][p.b][p.c]==0)
            {
                vis[p.a][p.b][p.c]=1;
                Q.push(p);
            }
        }

        if(q.b!=0)//b->其他;
        {
            if(q.b<=a-q.a)//b->a;如果b中的全都能倒到a中;
            {
                p.a=a-q.c;
                p.b=0;
                p.c=q.c;
                p.step=q.step+1;
            }

            if(vis[p.a][p.b][p.c]==0)
            {
                vis[p.a][p.b][p.c]=1;
                Q.push(p);
            }

            //以下同理;
            if(q.b<=c-q.c)//b->c;如果b中的全都能倒到c中;
            {
                p.a=q.a;
                p.b=0;
                p.c=a-q.a;
                p.step=q.step+1;
            }
            else//b不能全到完;因为c满了;
            {
                p.a=q.a;
                p.b=a-q.a-c;
                p.c=c;
                p.step=q.step+1;
            }
            if(vis[p.a][p.b][p.c]==0)
            {
                vis[p.a][p.b][p.c]=1;
                Q.push(p);
            }
        }

        if(q.c!=0)//c->其他;
        {
            if(q.c<=a-q.a)//c->a;如果c中的全都能倒到a中;
            {
                p.a=a-q.b;
                p.b=q.b;
                p.c=0;
                p.step=q.step+1;
            }

            if(vis[p.a][p.b][p.c]==0)
            {
                vis[p.a][p.b][p.c]=1;
                Q.push(p);
            }

            //以下同理;
            if(q.c<=b-q.b)//c->b;如果c中的全都能倒到b中;
            {
                p.a=q.a;
                p.b=a-q.a;
                p.c=0;
                p.step=q.step+1;
            }
            else//c不能全到完;因为b满了;
            {
                p.a=q.a;
                p.b=b;
                p.c=a-q.a-b;
                p.step=q.step+1;
            }
            if(vis[p.a][p.b][p.c]==0)
            {
                vis[p.a][p.b][p.c]=1;
                Q.push(p);
            }
        }
    }
    return -1;
}

int main()
{
    int a,b,c,ans;
    while(scanf("%d%d%d",&a,&b,&c),a+b+c)
    {
        if(a%2==1)
        {
            printf("NO\n");
            continue;
        }
        else
        {
            ans=BFS(a,b,c);
            if(ans==-1)
                printf("NO\n");
            else
                printf("%d\n",ans);
        }
    }
    return 0;
}
时间: 2024-10-13 22:02:47

非常可乐---hdu 1495(BFS)的相关文章

hdu 1495(BFS)

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

BFS(倒水问题) HDU 1495 非常可乐

题目传送门 1 /* 2 BFS:倒水问题,当C是奇数时无解.一共有六种情况,只要条件符合就入队,我在当该状态vised时写了continue 3 结果找了半天才发现bug,泪流满面....(网上找份好看的题解都难啊) 4 */ 5 /************************************************ 6 Author :Running_Time 7 Created Time :2015-8-4 10:54:16 8 File Name :HDOJ_1495.cpp

HDU 1495 非常可乐 (BFS)

 问题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1495 题目大意:一个瓶子容积s,两个杯子容积分别n,m,并且都没有刻度(不能比对噢!).相互倒水,求平分的他们的最少倒水次数. 思路:暴力搜索吧.并且求最少,(即最优解),所以上BFS: 思考:状态,转移过程,怎么剪纸. 惨痛的debug,我不解释了. 源代码: #include<iostream> #include<cstdio> #include<queue> #

HDU 1495——非常可乐( BFS )

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

hdu 1175 bfs 转弯题

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1175 和之前的1728类似.就是判断转弯数,建立一个用于记录转弯数的数组.. 还有就是对于特殊情况要进行考虑,比如起点与终点相同的情况,对于本题来说是不可以消去的应该输出NO.还有就是起点或终点是零这也是不行的,因为0代表没有棋子... 还有在判断能不能走的时候要小心,对于判断条件一定要小心,不要图赶快写.. 错误的地方都写在注释中了.. 代码: // hdu 1175 bfs 转弯数 //1.起点

Saving Princess claire_(hdu 4308 bfs模板题)

http://acm.hdu.edu.cn/showproblem.php?pid=4308 Saving Princess claire_ Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2305    Accepted Submission(s): 822 Problem Description Princess claire_ wa

HDU 1072 bfs

Nightmare Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 7083    Accepted Submission(s): 3409 Problem Description Ignatius had a nightmare last night. He found himself in a labyrinth with a tim

hdu 1252 BFS

1 /* 2 题意:给出一个m*m矩阵表示的完全图,且每个点都有自环,每条边都有一种颜色:有三个玩家ABC的三张纸片分别初始在 3 某三个位置(可以重叠),纸片可以沿着边走一步,可以走的路径的规则为:若A要走到某个点i,则A-i的颜色要和B-C的颜 4 色相同:问最少要走多少步.(题意太难懂了,看了别人的说明才弄懂了题意) 5 6 题解:BFS 7 首先初步分析题意似乎很难用图论来解决,那么就是搜索/DP/数据结构,然后从搜索方面去思考的话,就是要找状态,然 8 后初步列出所有信息,三个点得位置

hdu 4707 bfs

bfs基础算法水题 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<string> #include<vector> #include<queue> using namespace std; const int Max = 1e5+50; int dist[Max]; vector<int> t