POJ 3414 Pots([kuangbin带你飞]专题一 简单搜索)

题目连接:题目

题目大意:给你A,B两个杯子和一同水,问你能用两个杯子倒出C的水吗,

解题思路,这个题和非常可乐这个题很相似,其实差不多,但是这个题比较麻烦一些,,标记各种情况



#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
int a,b,c;
const int maxn = 100+5;
int r,l,v[maxn][maxn];
pair<int,int> q[maxn*maxn];
int x[maxn*maxn],p[maxn*maxn],op[maxn*maxn],d[maxn*maxn];
void init(){
	memset(x,0,sizeof(x));
	memset(p,0,sizeof(p));
	memset(op,0,sizeof(op));
	memset(d,0,sizeof(d));
}
void check(int i,int j,int o,int k){    //A中的水是i,B中的水是j,操作方法是0,操作的杯子是k 
	if(v[i][j]) return ;
	v[i][j]=1;			//标记当前状态 
	p[r]=l;				//标记当前位置 
	op[r]=o,x[r]=k,d[r]=d[l]+1;	//op记录操作方法,x记录操作的杯子,d记录操作的次数 
	q[r++]=make_pair(i,j); 	//把新状态放在队列里面 
}

int bfs(){
	int ca,cb=l=r=0;
	q[r++]=make_pair(0,0);
	memset(v,0,sizeof(v));
	v[0][0]=1;

	while(r>l){
		ca = q[l].first;
		cb = q[l].second;
		if(ca == c || cb == c) return l;
		check(a,cb,1,1);		//装满A中的水 
		check(ca,b,1,2);		//装满B中的水 
		check(0,cb,2,1);		//倒掉A中的水 
		check(ca,0,2,2);		//倒掉B中的水 
		if(ca > b - cb) check(ca - b + cb , b,3,1);  		//把A中的水倒满B 
		else check(0,ca+cb,3,1);
		if(cb > a - ca ) check(a,cb-a+ca,3,2);				//把B中的水倒满A 
		else check(ca+cb,0,3,2);
		++l;					//队列加一 
	}
	return 0;
}
void print(int k){
	if(p[k]>0) print(p[k]);
	if(op[k] == 1) printf("FILL(%d)\n", x[k]);  
    if(op[k] == 2) printf("DROP(%d)\n", x[k]);  
    if(op[k] == 3) printf("POUR(%d,%d)\n", x[k], 3 - x[k]);
}
int main(){
	while(~scanf("%d%d%d",&a,&b,&c)){
		init();
		int ans=0;
		if(ans=bfs()){
			printf("%d\n",d[ans]);
			print(ans); 
		}else printf("impossible\n");
	}
	return 0;
}


posted @ 2016-10-16 20:56  hong-ll  阅读(140)  评论(0编辑  收藏  举报