【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;
}




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章