问题 A: Jugs BFS

灌水问题:

1. 该题关键是:

根据 “如果有n个壶容积分别为A1,A2,……,An(Ai均为大于0的整数)设w为另一大于0的整数。则用此n个壶可倒出w升水的充要条件为:
1) w小于等于A1+A2+......+An;
2) w可被(A1,A2,......,An)(这n个数的最大公约数)整除。

据这两个条件来判断是否能够到处w升水

2.需注意的是 

1>在bfs过程中需要剪枝 剪枝是根据当前A B的状态来删减 (即 A B 的状态若之前达到的话没有必要再继续从这个状态去倒水 操作重复了) 否则内存将会爆

对于存在过的状态 用set<state> 来存储 set的find要想查找存在的结构体需要定义set的排序规则(set的排序和搜索都只和排序规则有关.如果排序规则输入的不全,就会搜索不到)

2>要注意的是要从池塘里灌水,一定要用空壶灌,要倒进池塘里的水,一定要是整壶的

set<state,stateSortCriteration> st;
st.find(s)==st.end()
class stateSortCriteration
{
    public:
            bool operator()(const state &a,const state &b)
            {
                if(a.A==b.A) return a.B<b.B;
                if(a.A<b.A) return true;
                else return false;

            }

};

#include<stdio.h>
#include<iostream>
#include<algorithm>
#include <string>
#include <queue>
#include <cstring>
#include <vector>
#include <set>
const int maxn=10010;
using namespace std;

string arr[6]={"fill A","fill B","pour A B","pour B A"
                 ,"empty A","empty B"};

struct state
{
    int A;
    int B;
};
struct jug
{
    int A;
    int B;
   vector<int> vt;
    jug()
    {
        A=0,B=0;
    }

};
void print(vector<int> vt)
{
    for(vector<int>::iterator it=vt.begin();it!=vt.end();it++)
    {
        cout<<arr[*it]<<endl;
    }

}
class stateSortCriteration
{
    public:
            bool operator()(const state &a,const state &b)
            {
                if(a.A==b.A) return a.B<b.B;
                if(a.A<b.A) return true;
                else return false;

            }

};
int flag=0;
void bfs(int Ca,int Cb,int N)
{

    set<state,stateSortCriteration> st;
    state s;
    queue<jug> q;
    jug p;
    p.A=Ca;
    p.vt.push_back(0);
    s.A=p.A,s.B=p.B;
    st.insert(s);
    q.push(p);
    p.A=0;p.B=Cb,p.vt.clear();
    p.vt.push_back(1);
    q.push(p);
    s.A=p.A,s.B=p.B;
    st.insert(s);
    while(!q.empty())
    {
        jug j;
        j=q.front();
        q.pop();
        if(j.A==N||j.B==N)
        {
            print(j.vt);

            return;
        }
        jug T=j;
       for(int i=0;i<6;i++)
       {
           T=j;
         if(j.A==0&&i==0)
         {

             T.A=Ca;
             T.vt.push_back(i);
              s.A=T.A,s.B=T.B;
             if(st.find(s)==st.end())
            {

             st.insert(s);
              q.push(T);
            }
         }
         if(j.B==0&&i==1)
         {
             T.B=Cb;
             T.vt.push_back(i);
             s.A=T.A,s.B=T.B;
             if(st.find(s)==st.end())
            {
             st.insert(s);
              q.push(T);
            }
         }
         if(j.A!=0&&j.B!=Cb&&i==2)
         {
              int t=0;
              t=Cb-j.B;
              if(j.A<t)
              {
                  T.B=j.B+j.A;
                   T.A=0;
              }else
                {
                    T.B=Cb;
                    T.A=j.A-t;
                }
              T.vt.push_back(i);
              s.A=T.A,s.B=T.B;
             if(st.find(s)==st.end())
            {
             st.insert(s);
              q.push(T);
            }
         }
         if(j.B!=0&&j.A!=Ca&&i==3)
         {
                int t=0;
              t=Ca-j.A;
              if(j.B<t)
              {
                  T.A=j.B+j.A;
                  T.B=0;
              }else
                {
                    T.A=Ca;
                    T.B=j.B-t;
                }
              T.vt.push_back(i);
             s.A=T.A,s.B=T.B;
             if(st.find(s)==st.end())
            {
              st.insert(s);
              q.push(T);
            }
         }
         if(j.A==Ca&&i==4)
         {
            T.A=0;
            T.vt.push_back(i);
          s.A=T.A,s.B=T.B;
             if(st.find(s)==st.end())
            {
             st.insert(s);
              q.push(T);
            }

         }
         if(j.B==Cb&&i==5)
         {
            T.B=0;
            T.vt.push_back(i);
              s.A=T.A,s.B=T.B;
             if(st.find(s)==st.end())
            {
             st.insert(s);
              q.push(T);
            }
         }

       }



    }
}

int main()
{
   int Ca,Cb,N;

    while(scanf("%d%d%d",&Ca,&Cb,&N)!=EOF)
    {
        bfs(Ca,Cb,N);

    }
       return 0;


}


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值