也是一道DFS的题目,但是要注意保存搜过的状态,不然会死循环的!!!
#include<iostream>
#include<string>
#include<stack>
#include<vector>
using namespace std;
vector<char> v;//a->b :'A' , b->a:'B' , fill a: 'C' , fill b: 'D' , empty a:'E', empty b:'F'
vector<int> reca,recb;
int A,B,t;
void output()
{
for(int i=0;i<v.size();i++)
{
if(v[i]=='A')
cout<<"pour A B"<<endl;
else if(v[i]=='B')
cout<<"pour B A"<<endl;
else if(v[i]=='C')
cout<<"fill A"<<endl;
else if(v[i]=='D')
cout<<"fill B"<<endl;
else if(v[i]=='E')
cout<<"empty A"<<endl;
else if(v[i]=='F')
cout<<"empty B"<<endl;
}
cout<<"success"<<endl;
}
bool flag;
//a->b :'A' , b->a:'B' , fill a: 'C' , fill b: 'D' , empty a:'E', empty b:'F'
inline bool check(int a,int b)
{
for(int i=0;i<reca.size();i++)
{
if(reca[i]==a && recb[i]==b)
{
return false;
}
}
return true;
}
void solve(int tempa,int tempb)
{
if(flag==true)
return;
if(tempa==t || tempb==t)
{
output();
flag=true;
return;
}
//fill a: 'C'
if(tempa!=A && (v.empty()==true || v[v.size()-1]!='E'))
{
if(check(A,tempb))
{
reca.push_back(A);
recb.push_back(tempb);
v.push_back('C');
solve(A,tempb);
v.pop_back();
reca.pop_back();
recb.pop_back();
}
}
if(tempb!=B && (v.empty()==true || v[v.size()-1]!='F'))
{
// fill b: 'D'
if(check(tempa,B))
{
reca.push_back(tempa);
recb.push_back(B);
v.push_back('D');
solve(tempa,B);
v.pop_back();
reca.pop_back();
recb.pop_back();
}
}
if(tempa)
{
int ss,tt;
//a->b :'A'
int restb=B-tempb;
if(restb>=tempa)
{
ss=0;
tt=tempb+tempa;
}
else
{
ss=tempa-restb;
tt=B;
}
if(check(ss,tt))
{
reca.push_back(ss);
recb.push_back(tt);
v.push_back('A');
solve(ss,tt);
v.pop_back();
reca.pop_back();
recb.pop_back();
}
}
if(tempb && (tempb+tempa)<=A)
{
//b->a :'B'
int ss,tt;
int resta=A-tempa;
if(resta>=tempb)
{
ss=tempb+tempa;
tt=0;
}
else
{
ss=A;
tt=tempb-resta;
}
if(check(ss,tt))
{
v.push_back('B');
reca.push_back(ss);
recb.push_back(tt);
solve(ss,tt);
v.pop_back();
reca.pop_back();
recb.pop_back();
}
}
if(tempa!=0 && (v.empty()==true || v[v.size()-1]!='C'))
{
// empty a:'E', empty b:'F'
if(check(0,tempb))
{
reca.push_back(0);
recb.push_back(tempb);
v.push_back('E');
solve(0,tempb);
v.pop_back();
reca.pop_back();
recb.pop_back();
}
}
if(tempb!=0 && (v.empty()==true || v[v.size()-1]!='D'))
{
if(check(tempa,0))
{
reca.push_back(tempa);
recb.push_back(0);
v.push_back('F');
solve(tempa,0);
v.pop_back();
reca.pop_back();
recb.pop_back();
}
}
}
int main()
{
while(cin>>A>>B>>t)
{
reca.clear();
recb.clear();
flag=false;
solve(0,0);
}
return 0;
}