POJ 3151:Pots

#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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章