母亲的牛奶【广搜】

来源:互联网 发布:淘宝售后客服工作职责 编辑:程序博客网 时间:2024/05/17 08:17

之前我不会用广搜,只会用深搜来做(见之前的深搜算法),解题思路如下:
1.广度优先搜索bfs
2.以bfs为例,把3个桶的状态作为一个结点入队,产生式规则是每个结点都可以给其他桶倒牛奶,只要倒入桶的状态还没有入队(需要一个标志数组vis记录3个桶的容量,是否出现过),就可以入队,当队为空时,bfs结束。
3.查找vis数组所有A桶为空时,C桶的容量,并从小到大依次输出。

#include<algorithm>#include<cstring>#include<cstdio>#include<queue>using namespace std;int s[21][21];int a[3],p;bool vis[21][21][21],flag,ans[21];struct node{    int x[3];};int main(){    //freopen("cow.in","r",stdin);    //freopen("cow.out","w",stdout);    scanf("%d %d %d",&a[0],&a[1],&a[2]);    queue<node> que;//定义一个队列来储存牛奶情况    node n;    n.x[0]=0;    n.x[1]=0;    n.x[2]=a[2];    que.push(n);    vis[0][0][a[2]]=1;    while(!que.empty())    {        n=que.front();que.pop();        for(int i=0;i<3;i++)            for(int j=0;j<3;j++)            {                //从0到2代表3个桶                if(i==j) continue//如果倒的桶跟被倒的桶是同一个,continue                //i-->j                p=min(a[j]-n.x[j],n.x[i]);//p=a[j]-n.x[j]表示把j倒满                                          //p=n.x[i]表示把i倒完                n.x[i]-=p;n.x[j]+=p;//倒牛奶                if(vis[n.x[0]][n.x[1]][n.x[2]]==0)//若这种情况没出现过                {                    vis[n.x[0]][n.x[1]][n.x[2]]=1;//记录                    que.push(n);//进入队列                }                n.x[i]+=p;n.x[j]-=p;//回溯            }    }    //用两个for来升序输出    for(int i=0;i<=a[1];i++)        for(int j=0;j<=a[2];j++)            if(vis[0][i][j]==1)                ans[j]=1;    for(int i=0;i<=a[2];i++)    {        if(ans[i]==1)        {            if(flag) printf(" ");            else flag=1;            printf("%d",i);        }    }}
1 0
原创粉丝点击