三个水杯
时间限制:1000 ms | 内存限制:65535 KB
难度:4
描述
给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子。三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算。现在要求你写出一个程序,使其输出使初始状态到达目标状态的最少次数。
输入
第一行一个整数N(0
/*
广搜
六个方向
a - > b
b - > a
c - > a
a - > c
b - > c
c - > b
http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=21
*/
#include<iostream>
#include<stdio.h>
#include<queue>
#include<string.h>
using namespace std;
struct LNode
{
int v1,v2,v3;
int step;
LNode()
{
step = 0;
}
};
int e1,e2,e3;
int v1,v2,v3;
int vis[107][107][107];//表示状态
int bfs()
{
LNode node;
node.v1 = v1;
node.v2 = 0;
node.v3 = 0;
node.step = 0;
queue<LNode> Q;
Q.push(node);
while(!Q.empty())
{
LNode now = Q.front();
vis[now.v1][now.v2][now.v3] = 1;
Q.pop();
if(now.v1 == e1 && now.v2 == e2 && now.v3 == e3)
return now.step;
if(now.v1 > 0)
{
// a->b
if(now.v2 < v2)
{
int tmp ;
if(now.v1 >= (v2 - now.v2))
tmp = (v2 - now.v2);
else
tmp = now.v1;
LNode next = now;
next.step ++;
next.v1 -= tmp;
next.v2 += tmp;
if(!vis[next.v1][next.v2][next.v3])
{
Q.push(next);
vis[next.v1][next.v2][next.v3] = 1;
}
}
// a- > c
if(now.v3 < v3)
{
int tmp ;
if(now.v1 >= (v3 - now.v3))
tmp = (v3 - now.v3);
else
tmp = now.v1;
LNode next = now;
next.step ++;
next.v1 -= tmp;
next.v3 += tmp;
if(!vis[next.v1][next.v2][next.v3])
{
Q.push(next);
vis[next.v1][next.v2][next.v3] = 1;
}
}
}
if(now.v2 > 0)
{
//b - > a
if(now.v1 < v1)
{
int tmp ;
if(now.v2 >= (v1 - now.v1))
tmp = (v1 - now.v1);
else
tmp = now.v2;
LNode next = now;
next.step ++;
next.v1 += tmp;
next.v2 -= tmp;
if(!vis[next.v1][next.v2][next.v3])
{
Q.push(next);
vis[next.v1][next.v2][next.v3] = 1;
}
}
//b- > c
if(now.v3 < v3)
{
int tmp ;
if(now.v2 >= (v3 - now.v3))
tmp = (v3 - now.v3);
else
tmp = now.v2;
LNode next = now;
next.step ++;
next.v3 += tmp;
next.v2 -= tmp;
if(!vis[next.v1][next.v2][next.v3])
{
Q.push(next);
vis[next.v1][next.v2][next.v3] = 1;
}
}
}
if(now.v3 > 0)
{
//c - > a
if(now.v1 < v1)
{
int tmp ;
if(now.v3 >= (v1 - now.v1))
tmp = (v1 - now.v1);
else
tmp = now.v3;
LNode next = now;
next.step ++;
next.v3 -= tmp;
next.v1 += tmp;
if(!vis[next.v1][next.v2][next.v3])
{
Q.push(next);
vis[next.v1][next.v2][next.v3] = 1;
}
}
//c - > b
if(now.v2 < v2)
{
int tmp ;
if(now.v3 >= (v2 - now.v2))
tmp = (v2 - now.v2);
else
tmp = now.v3;
LNode next = now;
next.step ++;
next.v3 -= tmp;
next.v2 += tmp;
if(!vis[next.v1][next.v2][next.v3])
{
Q.push(next);
vis[next.v1][next.v2][next.v3] = 1;
}
}
}
}
return -1;
}
int main()
{
int ncase;
cin>>ncase;
while(ncase--)
{
cin>>v1>>v2>>v3;
cin>>e1>>e2>>e3;
memset(vis,0,sizeof(vis));
int num = bfs();
cout<<num<<endl;
}
return 0;
}