HDU

来源:互联网 发布:.erm如何生成数据库表 编辑:程序博客网 时间:2024/06/16 01:28

哈哈中文题意,
目测应该很简单,想到了是广搜(最小次数嘛),但是却拿不定固定的方法,最后判定的方法应该是最大的装一半和 总瓶装一半,因为最小的那个玩意不一定能装一半,。。
感觉模拟一个杯子的过程。

#include<cstdio>#include<cstring>#include<algorithm>#include<queue>#define N 100+5using namespace std;struct node{    int a,b,s,t;}cole[N],st;int a,b,s;int vis[N][N];  //记录状态(二维就可以记录三维的状态)。int bfs(){    queue<node> q;    memset(vis,0,sizeof(vis));    st.a=0; st.b=0; st.s=s; st.t=0;    q.push(st);    vis[a][b]=1;    while(!q.empty())    {        node u=q.front(),v;        //能平分的条件是可乐瓶和容量大(a)的杯子都装着最开始一半的可乐。        if((u.a==s/2||u.b==s/2) && u.s==s/2)            return u.t;         if(u.a && u.b<=b)   //a->b        {            int c=b-u.b;            if(u.a>=c) v.b=b,v.a=u.a-c;            else v.b=u.b+u.a,v.a=0;            v.s=u.s; v.t=u.t+1;            if(!vis[v.a][v.b])            {                q.push(v);                vis[v.a][v.b]=1;            }        }         if(u.a && u.s<=s)   //a->b        {            int c=s-u.s;            if(u.a>=c) v.s=s,v.a=u.a-c;            else v.s=u.s+u.a,v.a=0;            v.b=u.b; v.t=u.t+1;            if(!vis[v.a][v.b])            {                q.push(v);                vis[v.a][v.b]=1;            }        }         if(u.b && u.s<=s)   //a->b        {            int c=s-u.s;            if(u.b>=c) v.s=s,v.b=u.b-c;            else v.s=u.s+u.b,v.b=0;            v.a=u.a; v.t=u.t+1;            if(!vis[v.a][v.b])            {                q.push(v);                vis[v.a][v.b]=1;            }        }         if(u.b && u.a<=a)   //a->b        {            int c=a-u.a;            if(u.b>=c) v.a=a,v.b=u.b-c;            else v.a=u.a+u.b,v.b=0;            v.s=u.s; v.t=u.t+1;            if(!vis[v.a][v.b])            {                q.push(v);                vis[v.a][v.b]=1;            }        }         if(u.s && u.b<=b)   //a->b        {            int c=b-u.b;            if(u.s>=c) v.b=b,v.s=u.s-c;            else v.b=u.b+u.a,v.s=0;            v.a=u.a; v.t=u.t+1;            if(!vis[v.a][v.b])            {                q.push(v);                vis[v.a][v.b]=1;            }        }         if(u.s && u.a<=a)   //a->b        {            int c=a-u.a;            if(u.s>=c) v.a=a,v.s=u.s-c;            else v.a=u.s+u.a,v.s=0;            v.b=u.b; v.t=u.t+1;            if(!vis[v.a][v.b])            {                q.push(v);                vis[v.a][v.b]=1;            }        }        q.pop();    }    return 0;   //所有扩展的状态都不能使之平分。}int main(){    while(scanf("%d%d%d",&s,&a,&b),s||a||b)    {        if(s%2)        {            puts("NO");            continue;        }        //if(a<b) swap(a,b); //这里使a作大号杯,方便bfs条件的判定。        int ans=bfs();        if(ans) printf("%d\n",ans);        else puts("NO");    }    return 0;}
原创粉丝点击