zoj1005 Jugs

/*
题意:有容量分别为Ca Cb 的A B两个壶 需要你通过几种操作使B壶中装有n容量的水
有如下操作
empty A
empty B
fill A
fill B
pour A B
pour B A
成功后输出success
*/
#include<iostream>
#include<stdio.h>
#include<cstring>
#include<string>
#include<vector>
using namespace std;
int vis[1001][1001];
int ca,cb,n;
vector <string> v;
void DFS(int x,int y)
{
	if(y==n)
	{
		for(int i=0;i<v.size();i++)
			cout<<v[i]<<endl;
		cout<<"success"<<endl;
		return;
	}
	if(!vis[ca][y])
	{
		vis[ca][y]=1;
		v.push_back("fill A"); 
	    DFS(ca,y);
		v.pop_back();
	}
	if(!vis[x][cb])
	{
		vis[x][cb]=1;
		v.push_back("fill B");
        DFS(x,cb);
		v.pop_back();
	}
    if(!vis[0][y])
	{  
		vis[0][cb]=1;
		v.push_back("empty A");
	    DFS(0,cb);
		v.pop_back();
	}
	if(!vis[x][0])
	{  
		vis[x][0]=1;
		v.push_back("empty B");
	    DFS(x,0);
		v.pop_back();
	}
	if(x+y>=cb&&!vis[x-(cb-y)][cb])
	{
		vis[x-cb+y][cb]=1;
		v.push_back("pour A B");
		DFS(x-cb+y,cb);
		v.pop_back();
	}
	if(x+y<cb&&!vis[0][x+y])
	{
		vis[0][x+y]=1;
		v.push_back("pour A B");
		DFS(0,x+y);
		v.pop_back();
	}
	if(x+y>=ca&&!vis[ca][x+y-ca])
	{
		vis[ca][x+y-ca]=1;
		v.push_back("pour B A");
		DFS(ca,x+y-ca);
		v.pop_back();
	}
	if(x+y<ca&&!vis[x+y][0])
	{
		vis[x+y][0]=1;
		v.push_back("pour B A");
		DFS(x+y,0);
		v.pop_back();
	}
}
int main()
{
   while(cin>>ca>>cb>>n)
   {

	   v.clear();
	   memset(vis,0,sizeof(vis));
	   vis[0][0]=1;
	   DFS(0,0);
   }
}
posted on 2011-05-04 20:38  4.5.6  阅读(236)  评论(0编辑  收藏  举报