题意:给空两个容量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