解题思路:注意这里水的总量是一定的,因而只要确定前两个水杯的水量,那么第三个杯子的水量就是固定的。所以这里只需利用一个二维数组记录a,b两个水杯的水量作为判重依据即可。状态之间的转换可以枚举每两个水杯可以比较轻易地得到。
问题大意:输入给定三个水杯,体积分别为a,b,c.最开始c水杯已满,a,b为空。现水杯之间可以互相倒水(要求必须是倒满某一个水杯,或是将某个水杯倒尽),组少需要道多少体积的水,可以使某一个杯子里的水量为d,或者小于d但是最接近。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<queue>
using namespace std;
const int maxn=205;
struct bot{
int v[3];
int amount;
bool operator <(const bot &A) const
{
return amount>A.amount;
}
};
int mark[maxn][maxn],dis[maxn];
int BFS(int a,int b,int c,int d)
{
int volume[3]={a,b,c};
priority_queue <bot> Q;
bot tmp;
tmp.v[0]=0;tmp.v[1]=0;tmp.v[2]=c;tmp.amount=0;
Q.push(tmp);
while(Q.empty()==false)
{
bot tmp1=Q.top();Q.pop();
for(int i=0;i<3;i++)
{
for(int j=0;j<3;j++)
{