倒水

(Segmentation Fault 这个代码提交时返回信息是这个,内存区段错误,至今没有搞懂这是个什么错误。这个代码虽然没有过,但是方法是不会有错的,这里只是介绍bfs能用来解决这一类问题,至少还是过了样例的)

注意这个是模拟手动入队,传进去的是tail,而不是head,因为要跳过两个入口,所以这道题是双入口的搜索,并且ready很重要,每次入一次队就要把它新的数据存到队里,而且tail要向下走一步,这道题就是要讨论六中情况:

fill A、fill B、pour A B、pour B A、empty A、empty B,逐步讨论完就可以了

#include<iostream>
#include<cstring>
using namespace std;
struct condition
{
    int a,b;
    int father,mean;
};
condition q[10000];
int A,B,N;
void ready()
{
    for(int i=0;i<10000;i++)
    {
        q[i].a=q[i].b=q[i].father=q[i].mean=0;
    }
}
void print(int x)
{
    if(x==-1)
        return;
    else
        print(q[x].father);
    switch(q[x].mean)
    {
        case 1:cout<<"fill A"<<endl;break;
        case 2:cout<<"fill B"<<endl;break;
        case 3:cout<<"pour A "<<endl;break;
        case 4:cout<<"pour B "<<endl;break;
        case 5:cout<<"empty A"<<endl;break;
        case 6:cout<<"empty B"<<endl;break;
    }
}
void bfs()
{
    if(B==N)
    {
        cout<<"fill B"<<endl;
        cout<<"success"<<endl;
    }
    ready();
    int head=0,tail=0;
    q[tail].a=A;
    q[tail].father=-1;
    q[tail].mean=1;
    tail++;
    q[tail].b=B;
    q[tail].father=-1;
    q[tail].mean=2;
    tail++;
    while(head<tail)
    {
        condition con=q[head];
        head++;
        if(con.a<A)
        {
            condition buf=con;
            buf.a=A;
            buf.father=head-1;
            buf.mean=1;
            q[tail]=buf;
            tail++;
        }
        if(con.b<B)
        {
            condition buf=con;
            buf.b=B;
            buf.father=head-1;
            buf.mean=2;
            q[tail]=buf;
            tail++;
        }
        if(con.a>0&&con.b<B)
        {
            condition buf=con;
            int temp=min(buf.a,B-buf.b);
            buf.a-=temp;
            buf.b+=temp;
            buf.father=head-1;
            buf.mean=3;
            q[tail]=buf;
            if(buf.b==N)
            {
                print(tail);
                break;
            }
            tail++;
        }
          if(con.b>0&&con.a<A)
        {
            condition buf=con;
            int temp=min(buf.b,A-buf.a);
            buf.a+=temp;
            buf.b-=temp;
            buf.father=head-1;
            buf.mean=4;
            q[tail]=buf;
            if(buf.b==N)
            {
                print(tail);
                break;
            }
            tail++;
        }
        if(con.a>0)
        {
            condition buf=con;
            buf.a=0;
            buf.father=head-1;
            buf.mean=5;
            q[tail]=buf;
            tail++;
        }
        if(con.b>0)
        {
            condition buf=con;
            buf.b=0;
            buf.father=head-1;
            buf.mean=6;
            q[tail]=buf;
            tail++;
        }

    }
}
int main()
{
    while(cin>>A>>B>>N)
    {
        bfs();
        cout<<"success"<<endl;
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值