一开始结构体开太小了。。。死都过不去。。。。后来改成100000的竟然AC了。。。太TM坑爹了。。。
#include <iostream>
#include <stack>
#include <cstdio>
#define size 100000
using namespace std;
stack <int > newStack;
int C[2] ,goal;
int tail;
int AC;
int s;
struct bullet
{
int S[2];
int last;
int oper;
}BUT[size];
void init_BUT(int w)
{
for( ; w >0;w--)
{
BUT[w].last = BUT[w].oper = BUT[w].S[0]=BUT[w].S[1] = 0;
}
}
void printf_BUT(int w)
{
int n = w;
while ( w != 0)
{
newStack.push(BUT[w].oper);
w=BUT[w].last;
}
while (!newStack.empty())
{
if(newStack.top() == 1){printf("fill A\n"); newStack.pop();continue;}
if (newStack.top() == 2){printf("fill B\n");newStack.pop();continue;}
if (newStack.top() == 3){printf("pour A B\n");newStack.pop();continue;}
if (newStack.top() == 4){printf("pour B A\n");newStack.pop();continue;}
if (newStack.top() == 5){printf("empty A\n");newStack.pop();continue;}
if (newStack.top() == 6){printf("empty B\n");newStack.pop();continue;}
}
printf("success\n");
init_BUT(n);
}
void fill(int x,int w,int i)
{
BUT[w].S[x] = C[x];
BUT[w].S[1-x] = BUT[i ].S[1-x];
BUT[w].last = i ;
if(!x) BUT[w].oper = 1;//满前一个
else BUT[w].oper = 2;//满后一个
if(BUT[w].S[0] == goal || BUT[w].S[1] == goal) AC = 1;
if(AC)printf_BUT(w);
}
void pour(int a,int b,int i,int w)
{
BUT[w].S[b] = BUT[i ].S[a] + BUT[i ].S[b];
if(BUT[w].S[b] > C[b]) { BUT[w].S[a] = BUT[w].S[b] - C[b];BUT[w].S[b] = C[b];}
else BUT[w].S[a] = 0;
BUT[w].last = i ;
if(a>b)BUT[w].oper = 4;//a倒进b
else BUT[w].oper =3;//b倒进a
if(BUT[w].S[0] == goal || BUT[w].S[1] == goal) AC = 1;
if(AC)printf_BUT(w);
}
void emptyBUT(int a, int i ,int w)
{
BUT[w].last = i ;
BUT[w].S[a] = 0;
BUT[w].S[1 - a] = BUT[i ].S[1-a];
if(!a)BUT[w].oper = 5;
else BUT[w].oper = 6;
if(BUT[w].S[0] == goal || BUT[w].S[1] == goal) AC = 1;
if(AC)printf_BUT(w);
}
void BFS(int i)
{
i++;
//*******先测可否满A******
if(AC)return;
if( BUT[i].S[0] < C[0]) fill(0,s++,i);
//*******测可否满B*******
if(AC)return;
if( BUT[i].S[1] < C[1]) fill(1,s++,i);
//*******可否A到进B******
if(AC)return;
if(BUT[i].S[0] && BUT[i].S[1] <C[1] ) pour(0,1,i,s++);
//*******可否B倒进A*****
if(AC)return;
if(BUT[i].S[1] && BUT[i].S[0] < C[0] )pour(1,0,i,s++);
//*******可否空A****
if(AC) return;
if(BUT[i].S[0] && BUT[i].S[1])emptyBUT(0 , i,s++);
//*******可否空B****
if(AC) return;
if(BUT[i].S[0] && BUT[i].S[1])emptyBUT(1 , i,s++);
if(AC) return;
BFS(i);
}
int main()
{
while (~scanf("%d%d%d",&C[0],&C[1],&goal))
{
tail = AC =0;
BUT[0].S[0]=BUT[0].S[1]=0;
BUT[0].last = -1;
s = 1;
BFS(-1);
}
return 0;
}