灌水问题:
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;
}