Description
Input
Output
Sample Input
3 5 4
Sample Output
6
Hint
题意:两个水杯,已知体积A,B,经过三种转换方式达到C状态
1.清空水杯A/B
2.装满A/B
3.把A/B杯中的水倒入B/A中
简单BFS 题目的原型是POJ3414 简化
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
int A, B, C;
int vis[105][105];
struct node
{
int a, b, step;
};
void BFS()
{
queue <node> q;
int sa,sb;
node f,t;
f.a = 0; f.b = 0; f.step = 0;
vis[f.a][f.b] = 1;
q.push(f);
while (!q.empty())
{
t = q.front();
q.pop();
if (t.a == C || t.b == C)
{
printf("%d\n",t.step);
return ;
}
for (int i = 1; i <= 6; i++)
{
if (i == 1) //装满A
{
sa = A;sb = t.b;
}
else if (i == 2)//装满B
{
sa = t.a; sb = B;
}
else if (i == 3)//把B中水倒入A
{
if (t.a + t.b > A)
{sb = t.a + t.b - A;sa = A;}
else
{sb = 0; sa = t.a + t.b;}
}
else if (i == 4)//把A中水倒入B
{
if (t.a + t.b > B)
{sa = t.a + t.b - B; sb = B;}
else
{
sa = 0; sb = t.a + t.b;
}
}
else if (i == 5)//清空A
{sa = 0; sb = t.b;}
else
{sa = t.a; sb = 0;}//清空B
if (!vis[sa][sb])
{
vis[sa][sb] = 1;
f.a = sa; f.b = sb;
f.step = t.step + 1;
q.push(f);
}
}
}
puts("impossible");
}
int main()
{
while (scanf("%d%d%d", &A, &B, &C) != EOF)
{
memset(vis, 0, sizeof(vis));
BFS();
}
return 0;
}
原文:http://blog.csdn.net/wjw0130/article/details/38277001