codevs1226 倒水问题 bfs

题目描述 Description

有两个无刻度标志的水壶,分别可装 x 升和 y 升 ( x,y 为整数且均不大于 100 )的水。设另有一水 缸,可用来向水壶灌水或接从水壶中倒出的水, 两水壶间,水也可以相互倾倒。已知 x 升壶为空 壶, y 升壶为空壶。问如何通过倒水或灌水操作, 用最少步数能在x或y升的壶中量出 z ( z ≤ 100 )升的水 来。

输入描述 Input Description

一行,三个数据,分别表示 x,y 和 z;

输出描述 Output Description

一行,输出最小步数 ,如果无法达到目标,则输出"impossible"

样例输入 Sample Input

3 22 1

样例输出 Sample Output

14

#include
#include
#include
#define  pii pair
using namespace std;
int vis[101][101],step;
int bfs(int x,int y,int z){
	if(z==0) return 0;
	if(x==z||y==z) return 1;
	memset(vis,-1,sizeof(vis));
	queue Q;
	pii t=make_pair(0,0),tt;
	Q.push(t);
	vis[0][0]=0;
	while(!Q.empty()){
		t=Q.front();
		step=vis[t.first][t.second];
		Q.pop();
		tt.first=x,tt.second=t.second;//fill 1
		if(vis[tt.first][tt.second]==-1){
			Q.push(tt);
			vis[tt.first][tt.second]=step+1;
		}
		tt.first=t.first,tt.second=y;//fill 2
		if(vis[tt.first][tt.second]==-1){
			Q.push(tt);
		vis[tt.first][tt.second]=step+1;
		}
		tt.first=0,tt.second=t.second;//empty 1
		if(vis[tt.first][tt.second]==-1){
			Q.push(tt);
			vis[tt.first][tt.second]=step+1;
		}
		tt.first=t.first,tt.second=0;//empty 2
		if(vis[tt.first][tt.second]==-1){
			Q.push(tt);
			vis[tt.first][tt.second]=step+1;
		}
		if(t.first+t.second<=x){//2 to 1 	
		tt.first=t.first+t.second,tt.second=0;
			if(vis[tt.first][tt.second]==-1){
			if(tt.first==z) return step+1;
			Q.push(tt);
			vis[tt.first][tt.second]=step+1;
		}
		}
		else{	tt.first=x,tt.second=t.second+t.first-x;
			if(vis[tt.first][tt.second]==-1){
			if(tt.second==z) return step+1;
			Q.push(tt);
		vis[tt.first][tt.second]=step+1;
		}
		}
		if(t.first+t.second<=y){//1 to 2
		tt.second=t.first+t.second,tt.first=0;
		
			if(vis[tt.first][tt.second]==-1){
			if(tt.second==z) return step+1;
			Q.push(tt);
			vis[tt.first][tt.second]=step+1;
		}
		}
		else{tt.second=y,tt.first=t.second+t.first-y;
			if(vis[tt.first][tt.second]==-1){
			if(tt.first==z) return step+1;
			Q.push(tt);
		vis[tt.first][tt.second]=step+1;
		}
		}
	}
	return -1;
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	int x,y,z;
	cin>>x>>y>>z;
	int ans=bfs(x,y,z);
	if(ans==-1)
	cout<<"impossible"<


你可能感兴趣的:(search)