題目描述:
有兩個無刻度標誌的水壺,分別可裝 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;
}