#include <bits/stdc++.h>
using namespace std;
int A, B, C;
struct Status{
int a, b;
int prev;
int mov; //用來定義operation
int src, dest;
};
Status que[11000];
int head = 0, tail = 1;
int flags[110][110];
vector<Status> result;
int i;
int main()
{
scanf("%d%d%d", &A, &B, &C);
memset(flags, 0, sizeof(flags));
que[head].a = 0;
que[head].b = 0;
que[head].prev = -1;
flags[0][0] = 1;
while(head != tail){
Status st = que[head];
if(st.a == C || st.b == C){
int ptr = head;
while(true){
if(que[ptr].prev == -1) break;
result.push_back(que[ptr]);
ptr = que[ptr].prev;
}
printf("%d\n", result.size());
for(i = result.size() - 1; i >= 0; i--){
switch(result[i].mov){
case 1://輸出FILL操作
printf("FILL(%d)\n", result[i].src);
break;
case 2: //輸出Drop操作
printf("DROP(%d)\n", result[i].src);
break;
case 3: //輸出POUR操作
printf("POUR(%d,%d)\n", result[i].src, result[i].dest);
break;
}
}
return 0;
}
Status newSt;
if(st.a < A && !flags[A][st.b]){
newSt = st;
newSt.a = A;
newSt.mov = 1; //執行FILL操作
newSt.src = 1;
newSt.prev = head;
que[tail++] = newSt;
flags[A][st.b] = 1;
}
if(st.b < B && !flags[st.a][B]){
newSt = st;
newSt.b = B;
newSt.mov = 1; //執行FILL操作
newSt.src = 2;
newSt.prev = head;
que[tail++] = newSt;
flags[st.a][B] = 1;
}
if(st.a > 0 && !flags[0][st.b]){
newSt = st;
newSt.a = 0;
newSt.mov = 2; //執行DROP操作
newSt.src = 1;
newSt.prev = head;
que[tail++] = newSt;
flags[0][st.b] = 1;
}
if(st.b > 0 && !flags[st.a][0]){
newSt = st;
newSt.b = 0;
newSt.mov = 2; //執行DROP操作
newSt.src = 2;
newSt.prev = head;
que[tail++] = newSt;
flags[st.a][0] = 1;
}
if(st.b < B && st.a > 0){
newSt = st;
int tmp = B - st.b;
int newa, newb;
if(st.a >= tmp){
newa = st.a - tmp;
newb = B;
}
else{
newa = 0;
newb = st.b + st.a;
}
if(!flags[newa][newb]){
newSt.a = newa;
newSt.b = newb;
newSt.src = 1;
newSt.dest = 2;
newSt.prev = head;
newSt.mov = 3; //執行POUR操作
que[tail++] = newSt;
flags[newa][newb] = 1;
}
}
if(st.a < A && st.b > 0){
newSt = st;
int tmp = A - st.a;
int newa, newb;
if(st.b >= tmp){
newb = st.b - tmp;
newa = A;
}
else{
newb = 0;
newa = st.a + st.b;
}
if(!flags[newa][newb]){
newSt.a = newa;
newSt.b = newb;
newSt.src = 2;
newSt.dest = 1;
newSt.prev = head;
newSt.mov = 3; //執行POUR操作
que[tail++] = newSt;
flags[newa][newb];
flags[newa][newb] = 1;
}
}
head++;
}
printf("impossible\n");
return 0;
}
POJ 3151:Pots
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.