题目大意:
a b 两个空锅进行一系列操作,容量分别为a和b,再下列操作中至少需要经过几次才可以让一个桶中的水量为c
操作:
FILL(i)从水龙头注满锅i(1≤i≤2);
DRO(i)将锅i排空至排水管;
POUR (i,j)从锅i倒到锅j中倒(i,j),在此操作之后,锅j满了(锅i中可能还剩下一些水),或者锅i空了(所有内容物都移到了锅j中)。
分析:
三种操作但是有两个锅,所以一共有六种可能,用BFS进行模拟,按顺序进行一定操作,如果可以就输出
#include<iostream>
#include<string>
#include<queue>
#include<stack>
#include<string.h>
using namespace std;
bool notvist[110][110];
int a,b,c;
struct node
{
int a,b,step;
char path[110];
int plen;
};
string path[]={ //6种操作
"FILL(1)"
,"FILL(2)"
,"DROP(1)"
,"DROP(2)"
,"POUR(1,2)"
,"POUR(2,1)"
};
void output_result(int step,char p[],int n) //输出结果
{
cout<<step<<endl;
for(int i=0;i<n;i++)
{
cout<<path[(int)p[i]]<<endl;
}
}
void bfs()
{
queue<node> q;
memset(notvist,true,sizeof(notvist));
node f;
f.a=0;
f.b=0;
f.step=0;
memset(f.path,0,sizeof(f.path));
f.plen=0;
q.push(f);
notvist[f.a][f.b]=false;
while (!q.empty())
{
f = q.front();
q.pop();
if(f.a==c||f.b==c)
{
output_result(f.step,f.path,f.plen);
return;
}
node v;
v = f;
v.step++;
v.plen++;
if(a-f.a>0) //Fill a
{
v.a = a;
v.b = f.b;
if(notvist[v.a][v.b])
{
v.path[f.plen] = 0;
q.push(v);
notvist[v.a][v.b]=false;
}
}
if(b-f.b>0)
{
v.a = f.a;
v.b = b;
if(notvist[v.a][v.b])
{
v.path[f.plen]=1;
q.push(v);
notvist[v.a][v.b]=false;
}
}
if(f.a)
{
v.a=0;
v.b=f.b;
if(notvist[v.a][v.b])
{
v.path[f.plen]=2;
q.push(v);
notvist[v.a][v.b]=false;
}
}
if(f.b)
{
v.b=0;
v.a=f.a;
if(notvist[v.a][v.b])
{
v.path[f.plen]=3;
q.push(v);
notvist[v.a][v.b]=false;
}
}
if(f.a&&(f.b<b))
{
if(f.a>(b-f.b))
{
v.a=f.a-(b-f.b);
v.b=b;
}
else
{
v.a=0;
v.b=f.b+f.a;
}
if(notvist[v.a][v.b])
{
v.path[f.plen] = 4;
q.push(v);
notvist[v.a][v.b] = false;
}
}
if(f.b && (f.a < a))
{
if(f.b > (a - f.a))
{
v.a = a;
v.b = f.b -(a - f.a);
} else {
v.a = f.a + f.b;
v.b = 0;
}
if(notvist[v.a][v.b])
{
v.path[f.plen] = 5;
q.push(v);
notvist[v.a][v.b] = false;
}
}
}
cout<<"impossible"<<endl;
}
int main()
{
cin>>a>>b>>c;
bfs();
return 0;
}