您的位置:首页 > 其它

Mother's Milk(usaco)

2010-08-06 11:45 483 查看
/* ID:tianlin2 
PROG:milk3 
LANG:C++
*/ 
#include <iostream>
#include <queue>
#include <fstream>
using namespace std;
class node
{
public:
	int curcommand[3];
	int curstate[3];
};
int states[21][21][21]={0};
int mycount=0;
int isend[50];
int cmmd[6]={12,21,102,201,120,210};
int a,b,c;
void bubble(int isend[],int mycount)
{ int b=0;
  while(!b){
	  b=1;
	  for(int i=0;i!=mycount-1;++i){
		  if(isend[i]>isend[i+1]){
			  int temp=isend[i];
			  isend[i]=isend[i+1];
			  isend[i+1]=temp;
			  b=0;
		  }
	  }
  }
}
int change(int& a1,int& b1,int& c1,int command)
{ 
	switch(command){
	case 12:
		if(b1==0||c1==c) return 0;
		if(c-c1>b1){
			c1+=b1;
			b1=0;
		}
		else{
			b1=b1-(c-c1);
			c1=c;
		}
		break;
	case 21:
		if(c1==0||b1==b) return 0;
		if(b-b1>c1){
			b1+=c1;
			c1=0;
		}
		else{
			c1=c1-(b-b1);
			b1=b;
		}
		break;
	case 102:
		if(a1==0||c1==c) return 0;
		if(c-c1>a1){
			c1+=a1;
			a1=0;
		}
		else{
			a1=a1-(c-c1);
			c1=c;
		}
		break;
	case 201:
		if(c1==0||a1==a) return 0;
		if(a-a1>c1){
			a1+=c1;
			c1=0;
		}
		else{
			c1=c1-(a-a1);
			a1=a;
		}
		break;
	case 120:
		if(a1==0||b1==b) return 0;
		if(b-b1>a1){
			b1+=a1;
			a1=0;
		}
		else{
			a1=a1-(b-b1);
			b1=b;
		}
		break;
	case 210:
		if(a1==a||b1==0) return 0;
		if(a-a1>b1){
			a1+=b1;
			b1=0;
		}
		else{
			b1=b1-(a-a1);
            a1=a;
		}
		break;
	}
	return 1;
}
	
int main()
{ ifstream fin("milk3.in");
  ofstream fout("milk3.out");
  fin>>a>>b>>c;
  states[0][0][c]=1;
  isend[mycount++]=c;
  queue<node> nodeq;
  node node1,node2;
  node1.curcommand[0]=0;
  node1.curcommand[1]=2;
  node1.curcommand[2]=1;
  int state[3]={0,0,c};
  if(c>b){
	  node1.curstate[2]=c-b;
	  node1.curstate[1]=b;
	  node1.curstate[0]=0;
	  states[0][b][c-b]=1;
	  isend[mycount++]=c-b;
  }
  else{
	  node1.curstate[2]=0;
	  node1.curstate[1]=c;
	  node1.curstate[0]=0;
	  states[0][c][0]=1;
	  isend[mycount++]=0;
  }
  nodeq.push(node1);
  if(c>a){
	  node2.curstate[2]=c-a;
	  node2.curstate[1]=0;
	  node2.curstate[0]=a;
	  states[a][0][c-a]=1;
  }
  else{
	  node2.curstate[2]=0;
	  node2.curstate[1]=0;
	  node2.curstate[0]=c;
	  states[c][0][0]=1;
  }
  node2.curcommand[0]=2;
  node2.curcommand[1]=0;
  node2.curcommand[2]=1;
  nodeq.push(node2);
  while(!nodeq.empty()){
	  node curnode=nodeq.front();
	  nodeq.pop();
	  int curcmmd=curnode.curcommand[2]+curnode.curcommand[1]*10+curnode.curcommand[0]*100;
	  int a1=curnode.curstate[0];
	  int b1=curnode.curstate[1];
	  int c1=curnode.curstate[2];
	  int i;
	  for(i=0;i!=6;++i)
		  if(cmmd[i]==curcmmd) break;
	  for(int j=0;j!=6;++j){
		  int a2=a1,b2=b1,c2=c1;
		  if(j/2!=i/2){
			  if(change(a2,b2,c2,cmmd[j])&&!states[a2][b2][c2]){
				  states[a2][b2][c2]=1;
				  if(a2==0) isend[mycount++]=c2;
				  node nxtnode;
				  int nxtcmmd=cmmd[j];
				  nxtnode.curcommand[2]=nxtcmmd%10;
				  nxtcmmd/=10;
				  nxtnode.curcommand[1]=nxtcmmd%10;
				  nxtcmmd/=10;
				  nxtnode.curcommand[0]=nxtcmmd%10;
				  nxtnode.curstate[0]=a2;
				  nxtnode.curstate[1]=b2;
				  nxtnode.curstate[2]=c2;
				  nodeq.push(nxtnode);
			  }
		  }
	  }
  }
  bubble(isend,mycount);
  for(int i=0;i!=mycount;++i){
	  if(!i) fout<<isend[i];
	  else fout<<' '<<isend[i];
  }
  fout<<endl;
  //system("pause");
  return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: