您的位置:首页 > 其它

【CODEVS】倒水问题

2016-11-16 13:54 281 查看
题目描述:

有两个无刻度标志的水壶,分别可装
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: