【CODEVS】倒水问题


题目描述:

有两个无刻度标志的水壶,分别可装 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;
}




posted @ 2016-11-16 13:54  嘒彼小星  阅读(218)  评论(0编辑  收藏  举报