题意:给空两个容量A,B的杯具,
求使用一些操作后能倒出C容量的水
操作:1,把其中一个倒满水,
2,把其中一个水倒掉
3,把其中一个杯具的水倒向另一个杯具里,如果水满了还没有倒完,则水保留在原来的杯具中
思路:简单的BFS,
1,用一个二维矩阵记录访问状态
2,记录每个状态点的操作
3,记录每个状态点的上个位置。
#include<iostream>
#include<queue>
using namespace std;
int a,B,c;
struct my
{
int x,y;
};
bool b[101][101];
int pre[101][101];
my p[101][101];
int num=0;
//1: fill 1 2: fill 2 3: out 1 4: out 2 5: 1->2 6: 2->1
void put(int x,int y)
{
if (!x && !y)
return ;
put(p[x][y].x,p[x][y].y);
switch (pre[x][y])
{
case 1: puts("FILL(1)");break;
case 2: puts("FILL(2)");break;
case 3: puts("DROP(1)");break;
case 4: puts("DROP(2)");break;
case 5: puts("POUR(1,2)");break;
case 6: puts("POUR(2,1)");break;
}
}
void put_num(int x,int y)
{
if (!x && !y)
{
printf("%d\n",num);
return ;
}
num++;
put_num(p[x][y].x,p[x][y].y);
}
int main()
{
int i,j,k;
cin>>a>>B>>c;
queue<my> q;
my d;
my cur;
memset(b,false,sizeof(b));
d.x=0;
d.y=0;
q.push(d);
my ans;
ans.x=-1;
b[0][0]=true;
while (!q.empty())
{
d=q.front();
q.pop();
if (d.x==c || d.y==c)
{
ans=d;
break;
}
if (d.x<a)
{
cur.x=a;
cur.y=d.y;
if (!b[cur.x][cur.y])
{
b[cur.x][cur.y]=true;
q.push(cur);
pre[cur.x][cur.y]=1;
p[cur.x][cur.y]=d;
}
}
if (d.y<B)
{
cur.x=d.x;
cur.y=B;
if (!b[cur.x][cur.y])
{
b[cur.x][cur.y]=true;
q.push(cur);
pre[cur.x][cur.y]=2;
p[cur.x][cur.y]=d;
}
}
if (d.x)
{
cur.x=0;
cur.y=d.y;
if (!b[cur.x][cur.y])
{
b[cur.x][cur.y]=true;
q.push(cur);
pre[cur.x][cur.y]=3;
p[cur.x][cur.y]=d;
}
}
if (d.y)
{
cur.x=d.x;
cur.y=0;
if (!b[cur.x][cur.y])
{
b[cur.x][cur.y]=true;
q.push(cur);
pre[cur.x][cur.y]=4;
p[cur.x][cur.y]=d;
}
}
if (d.x && d.y<B)
{
if (B-d.y>=d.x)
cur.x=0,cur.y=d.y+d.x;
else
cur.x=d.x-(B-d.y),cur.y=B;
if (!b[cur.x][cur.y])
{
b[cur.x][cur.y]=true;
q.push(cur);
pre[cur.x][cur.y]=5;
p[cur.x][cur.y]=d;
}
}
if (d.x<a && d.y)
{
if (a-d.x>=d.y)
cur.x=d.x+d.y,cur.y=0;
else
cur.x=a,cur.y=d.y-(a-d.x);
if (!b[cur.x][cur.y])
{
b[cur.x][cur.y]=true;
q.push(cur);
pre[cur.x][cur.y]=6;
p[cur.x][cur.y]=d;
}
}
}
if (ans.x!=-1)
put_num(ans.x,ans.y),put(ans.x,ans.y);
else
puts("impossible");
return 0;
}
http://poj.org/problem?id=3414