571

#include <iostream>
#include <queue>
#include <string.h>
#include <map>
#include <vector>

#define EmA 3
#define EmB 4
#define FilA 1
#define FilB 2
#define PorAB 5
#define PorBA 6
using namespace std;


struct point{
	int x;
	int y;
};

point inp,rp,tmp;
int gr[1002][1002];
int work[1002][1002];
point par[1002][1002];
vector<int> vb;

int A,B,C;

void path(point p)
{
	int i,j;

	i = p.x;
	j = p.y;

	if(i==0 && j==0)
	return;

	vb.push_back(work[i][j]);
	p = par[i][j];
	path(p);
}

int main()
{
	while(cin>>A)
	{
		cin>>B>>C;
		//memset(work,0,sizeof(work));
		memset(gr,0,sizeof(gr));
		queue<point> que;
		inp.x=0;
		inp.y=0;
		que.push(inp);
		gr[0][0]=1;
		while(!que.empty())
		{
			inp = que.front();
			que.pop();

			if(inp.y==C)
			{
				break;
			}



			//fill A
			rp.x = A;
			rp.y = inp.y;
			if(gr[rp.x][rp.y]==0)
			{
				gr[rp.x][rp.y]= gr[inp.x][inp.y]+1;
				que.push(rp);
				par[rp.x][rp.y]=inp;
				work[rp.x][rp.y] = FilA;
			}

			//fill B
			rp.x = inp.x;
			rp.y = B;
			if(gr[rp.x][rp.y]==0)
			{
				gr[rp.x][rp.y]= gr[inp.x][inp.y]+1;
				que.push(rp);
				par[rp.x][rp.y]=inp;
				work[rp.x][rp.y] = FilB;
			}

			//empty A
			rp.x= 0;
			rp.y=inp.y;
			if(gr[rp.x][rp.y]==0)
			{
				gr[rp.x][rp.y]= gr[inp.x][inp.y]+1;
				que.push(rp);
				par[rp.x][rp.y]=inp;
				work[rp.x][rp.y] = EmA;
			}

			//emppty B
			rp.x= inp.x;
			rp.y = 0;
			if(gr[rp.x][rp.y]==0)
			{
				gr[rp.x][rp.y]= gr[inp.x][inp.y]+1;
				que.push(rp);
				par[rp.x][rp.y]=inp;
				work[rp.x][rp.y] = EmB;
			}
			// A->B
			if(inp.x+inp.y>=B)
			{
				rp.x= inp.x - (B-inp.y);
				rp.y=B;
			}
			else
			{
				rp.x= 0;
				rp.y = inp.x+inp.y;
			}

			if(gr[rp.x][rp.y]==0)
			{
				gr[rp.x][rp.y]= gr[inp.x][inp.y]+1;
				que.push(rp);
				par[rp.x][rp.y]=inp;
				work[rp.x][rp.y] = PorAB;
			}

			//B->A
			if(inp.x+inp.y>=A)
			{
				rp.x= A;
				rp.y=inp.y-(A-inp.x);
			}
			else
			{
				rp.x=inp.x+inp.y;
				rp.y= 0;
			}

			if(gr[rp.x][rp.y]==0)
			{
				gr[rp.x][rp.y]= gr[inp.x][inp.y]+1;
				que.push(rp);
				par[rp.x][rp.y]=inp;
				work[rp.x][rp.y] = PorBA;
			}
		}
		vb.clear();
		path(inp);

		for(int i=vb.size()-1;i>=0;i--)
		{
			if(vb[i]==1)
			{
				cout<<"fill A\n";
			}
			else if(vb[i]==2)
			{
				cout<<"fill B\n";
			}
			else if(vb[i]==3)
			{
				cout<<"empty A\n";
			}
			else if(vb[i]==4)
			{
				cout<<"empty B\n";
			}
			else if(vb[i]==5)
			{
				cout<<"pour A B\n";
			}
			else if(vb[i]==6)
			{
				cout<<"pour B A\n";
			}
		}
		cout<<"success\n";
	}
	return 0;
}

 

Leave a Reply

Your email address will not be published. Required fields are marked *