思路:
其實就是要判斷可樂能不能被平分……..
有六種狀態,從a瓶到b瓶,a–>c
b–>a b–>c
c–>a c–>b
然後每種狀態裏面又分兩種不同情況,可以將此瓶的水全部清空,不能清空……
然後廣搜就可以了……..
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int vist[105][105][105];
int a, b, c;
struct node
{
int a, b, c;
int step;
}s[105];
int sum = 0;
int bfs();
int main()
{
while (scanf_s("%d %d %d", &a, &b, &c) != EOF && (a + b + c))
{
if (a % 2 == 1)
{
printf("NO\n");
continue;
}
int ans = bfs();
if (ans >= 0)
printf("%d\n", ans);
else
printf("NO\n");
}
return 0;
}
int bfs()
{
queue<node>q;
memset(vist, 0, sizeof(vist));
node p1;
p1.a = a;
p1.b = 0;
p1.c = 0;
p1.step = 0;
q.push(p1);
vist[p1.a][0][0] = 1;
while (!q.empty())
{
p1 = q.front();
q.pop();
if ((p1.a == a / 2 && p1.b == a / 2) || (p1.a == a / 2 && p1.c == a / 2) || (p1.b == a / 2 && p1.c == a / 2)) //如果平分就返回步數
{
return p1.step;
}
node p2;
if (p1.a != 0)
{
if (p1.a > b - p1.b)//a往b倒,a還沒清空
{
p2.a = p1.a - (b - p1.b);
p2.b = b;
p2.c = p1.c;
p2.step = p1.step + 1;
}
else//a往b倒,a清空
{
p2.a = 0;
p2.b = p1.b + p1.a;
p2.c = p1.c;
p2.step = p1.step + 1;
}
if (!vist[p2.a][p2.b][p2.c])//用vist[][][]標記是否走過,走過標記爲1
{
vist[p2.a][p2.b][p2.c] = 1;
q.push(p2);//將這種情況入隊
}
}
if (p1.a != 0)
{
if (p1.a > c - p1.c)
{
p2.a = p1.a - (c - p1.c);
p2.b = p1.b;
p2.c = c;
p2.step = p1.step + 1;
}
else
{
p2.a = 0;
p2.b = p1.b;
p2.c = p1.c + p1.a;
p2.step = p1.step + 1;
}
if (!vist[p2.a][p2.b][p2.c])
{
vist[p2.a][p2.b][p2.c] = 1;
q.push(p2);
}
}
if (p1.b != 0)
{
if (p1.b>a - p1.a)
{
p2.b = p1.b - (a - p1.a);
p2.a = a;
p2.c = p1.c;
p2.step = p1.step + 1;
}
else
{
p2.b = 0;
p2.a = p1.a + p1.b;
p2.c = p1.c;
p2.step = p1.step + 1;
}
if (!vist[p2.a][p2.b][p2.c])
{
vist[p2.a][p2.b][p2.c] = 1;
q.push(p2);
}
}
if (p1.b != 0)
{
if (p1.b>c - p1.c)
{
p2.b = p1.b - (c - p1.c);
p2.a = p1.a;
p2.c = c;
p2.step = p1.step + 1;
}
else
{
p2.b = 0;
p2.a = p1.a;
p2.c = p1.c + p1.b;
p2.step = p1.step + 1;
}
if (!vist[p2.a][p2.b][p2.c])
{
vist[p2.a][p2.b][p2.c] = 1;
q.push(p2);
}
}
if (p1.c != 0)
{
if (p1.c>a - p1.a)
{
p2.c = p1.c - (a - p1.a);
p2.a = a;
p2.b = p1.b;
p2.step = p1.step + 1;
}
else
{
p2.c = 0;
p2.a = p1.a + p1.c;
p2.b = p1.b;
p2.step = p1.step + 1;
}
if (!vist[p2.a][p2.b][p2.c])
{
vist[p2.a][p2.b][p2.c] = 1;
q.push(p2);
}
}
if (p1.c != 0)
{
if (p1.c>b - p1.b)
{
p2.c = p1.c - (b - p1.b);
p2.a = p1.a;
p2.b = b;
p2.step = p1.step + 1;
}
else
{
p2.c = 0;
p2.a = p1.a;
p2.b = p1.b + p1.c;
p2.step = p1.step + 1;
}
if (!vist[p2.a][p2.b][p2.c])
{
vist[p2.a][p2.b][p2.c] = 1;
q.push(p2);
}
}
}
return -1;
}