codevs1226 倒水问题 bfs

来源:互联网 发布:国外社交软件排名 编辑:程序博客网 时间:2024/05/17 09:10
题目描述 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<iostream>#include<queue>#include<cstring>#define  pii pair<int,int>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<pii> 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 1if(vis[tt.first][tt.second]==-1){Q.push(tt);vis[tt.first][tt.second]=step+1;}tt.first=t.first,tt.second=y;//fill 2if(vis[tt.first][tt.second]==-1){Q.push(tt);vis[tt.first][tt.second]=step+1;}tt.first=0,tt.second=t.second;//empty 1if(vis[tt.first][tt.second]==-1){Q.push(tt);vis[tt.first][tt.second]=step+1;}tt.first=t.first,tt.second=0;//empty 2if(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 2tt.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"<<endl;elsecout<<ans<<endl;return 0;}


1 0
原创粉丝点击