hdu1495--bfs

79 阅读1分钟

中文题就不说题意了,思路就是bfs模拟倒可乐,因为有三个容器所以每次都有六个方向可以选择,代码虽然很长,但是六个过程就是复制粘贴,不小心在bfs的过程中,写错了一个变量,结果数组越界,直接re,找了老半天,果然代码写越长就越容易出现纰漏。

//#include<iostream>
#include<cstdio> 
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
struct no{
	int a,b,c,t;
}st;
int jud[110][110];
int ma,mi,bo;
int bfs(){
	queue<no> q;
	st.a=0;st.b=0;st.c=bo;st.t=0;
	q.push(st);
	jud[ma][mi]=1;
	while(!q.empty()){
		st=q.front();
		no v;
		if(st.a==bo/2&&st.c==bo/2){
			return st.t;
		}
		if(st.a!=ma&&st.c){//瓶子倒大杯 
			int te=ma-st.a;
			if(st.c>te){
				v.a=ma;v.c=st.c-te;
			}
			else{
				v.a=st.a+st.c;v.c=0;
			}
			v.b=st.b;v.t=st.t+1;
			if(!jud[v.a][v.b]){
				q.push(v);
				jud[v.a][v.b]=1;
				}
		}
		
		if(st.b!=mi&&st.c){//瓶子倒小杯 
			int te=mi-st.b;
			if(st.c>te){
				v.b=mi;v.c=st.c-te;
			}
			else{
				v.b=st.b+st.c;v.c=0;
			}
			v.a=st.a;v.t=st.t+1;
			if(!jud[v.a][v.b]){
				q.push(v);
				jud[v.a][v.b]=1;
				}
		}
		
		if(st.a&&st.c!=bo){//大杯倒瓶子 
			int te=bo-st.c;
			if(st.a>te){
				v.c=bo;v.a=st.a-te;
			}
			else{
				v.c=st.c+st.a;v.a=0;
			}
			v.b=st.b;v.t=st.t+1;
			if(!jud[v.a][v.b]){
				q.push(v);
				jud[v.a][v.b]=1;
				}
		}
		
		if(st.a&&st.b!=mi){//大杯倒小杯 
			int te=mi-st.b;
			if(st.a>te){
				v.b=mi;v.a=st.a-te;
			}
			else{
				v.b=st.b+st.a;v.a=0;
			}
			v.c=st.c;v.t=st.t+1;
			if(!jud[v.a][v.b]){
				q.push(v);
				jud[v.a][v.b]=1;
				}
		}
		
		if(st.a!=ma&&st.b){//小杯倒大杯 
			int te=ma-st.a;
			if(st.b>te){
				v.a=ma;v.b=st.b-te;
			}
			else{
				v.a=st.a+st.b;v.b=0;//在这里b写成了c,结果数组越界,提交的时候崩溃了 
			}
			v.c=st.c;v.t=st.t+1;
			if(!jud[v.a][v.b]){
				q.push(v);
				jud[v.a][v.b]=1;
				}
		}
		
		if(st.c!=bo&&st.b){//小杯倒瓶子 
			int te=bo-st.c;
			if(st.b>te){
				v.c=bo;v.b=st.b-te;
			}
			else{
				v.c=st.b+st.c;v.b=0;
			}
			v.a=st.a;v.t=st.t+1;
			if(!jud[v.a][v.b]){
				q.push(v);
				jud[v.a][v.b]=1;
				}
		}
		q.pop();
	}
	return 0;	
}
int main(){
	while(scanf("%d%d%d",&bo,&ma,&mi)&&(ma||mi||bo)){
		memset(jud,0,sizeof(jud));
		if(ma<mi) swap(ma,mi);
		if(bo%2) {
	 puts("NO");
		continue;
		}
		int co=bfs();
		if(co) printf("%d\n",co);
		else  puts("NO");
	}
	return 0;
} 


\