首页 > 代码库 > HDU 1495 非常可乐 (BFS)

HDU 1495 非常可乐 (BFS)



问题链接:http://acm.hdu.edu.cn/showproblem.php?pid=1495


题目大意:一个瓶子容积s,两个杯子容积分别n,m,并且都没有刻度(不能比对噢!)。相互倒水,求平分的他们的最少倒水次数。


思路:暴力搜索吧。并且求最少,(即最优解),所以上BFS;

思考:状态,转移过程,怎么剪纸。



惨痛的debug,我不解释了。

源代码:

#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#define maxn 110
using namespace std;

int s,n,m;
int vis[maxn][maxn][maxn];
int sum=0;
struct node{
    int s;
    int n;
    int m;
    int cnt;
    //node(){}
    node(int x,int y,int z,int c)
    {
        s=x;n=y;m=z;cnt=c;
    }
};

int BFS(node sta,int time)
{
    //int cnt=0;
    //cout<<"time-->"<<time<<endl;
    queue<node> que;
    que.push(sta);
    while(que.front().cnt<=time&&!que.empty())
    {

        node cur=que.front();
        //cout<<cur.s<<"---->"<<cur.n<<"--->"<<cur.m<<endl;

        que.pop();
        if((cur.s==cur.n&&!cur.m)||(cur.s==cur.m&&!cur.n)||(cur.m==cur.n&&!cur.s))
        {
            //cout<<"fuck-->1"<<endl;
            return cur.cnt;
        }
        if(vis[cur.s][cur.n][cur.m])
            continue;

        vis[cur.s][cur.n][cur.m]=1;

        if(cur.s)//-------->s
        {
            if(cur.n<n)
            {
                if(cur.s>n-cur.n)
                    que.push(node(cur.s-(n-cur.n),n,cur.m,cur.cnt+1));

                else
                    que.push(node(0,cur.n+cur.s,cur.m,cur.cnt+1));
            }
            if(cur.m<m)
            {
                if(cur.s>m-cur.m)
                    que.push(node(cur.s-(m-cur.m),cur.n,m,cur.cnt+1));

                else
                    que.push(node(0,cur.n,cur.m+cur.s,cur.cnt+1));
            }
        }

        if(cur.n)//--------->n
        {
            if(cur.s<s)
            {
                if(cur.n>s-cur.s)
                    que.push(node(s,cur.n-(s-cur.s),cur.m,cur.cnt+1));
                else
                    que.push(node(cur.s+cur.n,0,cur.m,cur.cnt+1));
            }
            if(cur.m<m)
            {
                if(cur.n>m-cur.m)
                    que.push(node(cur.s,cur.n-(m-cur.m),m,cur.cnt+1));

                else
                    que.push(node(cur.s,0,cur.m+cur.n,cur.cnt+1));
            }


        }

        if(cur.m)
        {
            if(cur.s<s)
            {
                if(cur.m>s-cur.s)
                    que.push(node(s,cur.n,cur.m-(s-cur.s),cur.cnt+1));
                else
                    que.push(node(cur.s+cur.m,cur.n,0,cur.cnt+1));
            }
            if(cur.n<n)
            {
                if(cur.m>n-cur.n)
                    que.push(node(cur.s,n,cur.m-(n-cur.n),cur.cnt+1));

                else
                    que.push(node(cur.s,cur.n+cur.m,0,cur.cnt+1));
            }
        }
    }

    //cout<<"fuck-->2"<<endl;

    return -1;
}

int main()
{
    while(scanf("%d%d%d",&s,&n,&m),s||n||m)
    {
        memset(vis,0,sizeof vis);
        node sta(s,0,0,0);
        //cout<<"sta.cnt-->"<<sta.cnt<<endl;
        //vis[s][0][0]=1;
        int res=BFS(sta,s*n*m);
        if(res==-1)
            printf("NO\n");
        else
            printf("%d\n",res);
    }
    return 0;


}