题目描述:
有两个无刻度标志的水壶,分别可装 x 升和 y 升 ( x,y 为整数且均不大于 100 )的水。设另有一水 缸,可用来向水壶灌水或接从水壶中倒出的水, 两水壶间,水也可以相互倾倒。已知 x 升壶为空 壶, y 升壶为空壶。问如何通过倒水或灌水操作, 用最少步数能在x或y升的壶中量出 z ( z ≤ 100 )升的水 来
输入描述:
一行,三个数据,分别表示
x,y 和 z;
输出描述:
一行,输出最小步数
,如果无法达到目标,则输出"impossible"
样例输入:
3
22 1
样例输出:
14
直接暴力掉。x倒入y中、y倒入z中、x倒空、z倒空、x倒满、y倒满六种大情况。
#include<cstdio> #include<iostream> #include<queue> using namespace std; int x,y,z; bool book[20000][20000]; struct v { int a,b,step; bool operator()() { return a==z || b==z; } v(int c,int d,int e):a(c),b(d),step(e){}; }; queue<v> q; bool bfs() { v temp(0,0,0); q.push(temp); while(!q.empty()) { int a,b,step; temp=q.front(); q.pop(); if(temp()) { cout<<temp.step; return true; } a=temp.a; b=temp.b; step=temp.step; for(int i=0;i<6;i++) { int q1,q2,q3; if(i==0&&a!=x)q1=x,q2=b,q3=step+1; else if(i==1&&b!=y)q1=a,q2=y,q3=step+1; else if(i==2&&b<y&&a>0){ if(b+a>y) q1=a-y+b,q2=y,q3=step+1; else q1=0,q2=b+a,q3=step+1; } else if(i==3&&a<x&&b>0){ if(a+b>x) q1=x,q2=b-x+a,q3=step+1; else q1=b+a,q2=0,q3=step+1; } else if(i==4&&a>0) q1=0,q2=b,q3=step+1; else if(i==5&&b>0) q1=a,q2=0,q3=step+1; if(!book[q1][q2]) { q.push(v(q1,q2,q3)); book[q1][q2]=true; } } } return false; } int main() { cin>>x>>y>>z; if(!bfs()) cout<<"impossible"; return 0; }