一道算法题求助,据说是简单题

niuxiao 2005-12-26 12:12:32
In the movie "Die Hard 3", Bruce Willis and Samuel L. Jackson were confronted with the following puzzle. They were given a 3-gallon jug and a 5-gallon jug and were asked to fill the 5-gallon jug with exactly 4 gallons. This problem generalizes that puzzle.

You have two jugs, A and B, and an infinite supply of water. There are three types of actions that you can use: (1) you can fill a jug, (2) you can empty a jug, and (3) you can pour from one jug to the other. Pouring from one jug to the other stops when the first jug is empty or the second jug is full, whichever comes first. For example, if A has 5 gallons and B has 6 gallons and a capacity of 8, then pouring from A to B leaves B full and 3 gallons in A.

A problem is given by a triple (Ca,Cb,N), where Ca and Cb are the capacities of the jugs A and B, respectively, and N is the goal. A solution is a sequence of steps that leaves exactly N gallons in jug B. The possible steps are

fill A
fill B
empty A
empty B
pour A B
pour B A
success

where "pour A B" means "pour the contents of jug A into jug B", and "success" means that the goal has been accomplished.

You may assume that the input you are given does have a solution.

Input

Input to your program consists of a series of input lines each defining one puzzle. Input for each puzzle is a single line of three positive integers: Ca, Cb, and N. Ca and Cb are the capacities of jugs A and B, and N is the goal. You can assume 0 < Ca <= Cb and N <= Cb <=1000 and that A and B are relatively prime to one another.

Output

Output from your program will consist of a series of instructions from the list of the potential output lines which will result in either of the jugs containing exactly N gallons of water. The last line of output for each puzzle should be the line "success". Output lines start in column 1 and there should be no empty lines nor any trailing spaces.

Sample Input

3 5 4
5 7 3


Sample Output

fill B
pour B A
empty A
pour B A
fill B
pour B A
success
fill A
pour A B
fill A
pour A B
empty B
pour A B
success

---------------------------

据说用BFS可以求解,但我没有思路,这和BFS有什么联系?请给个思路,谢谢

另外有更好的算法欢迎提出!
...全文
328 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
ShowLovE 2005-12-29
  • 打赏
  • 举报
回复
简单的宽搜, 无非就是遍历一个隐式图...
Kid4you 2005-12-27
  • 打赏
  • 举报
回复
ZJU的1010以内的吧记得
niuxiao 2005-12-27
  • 打赏
  • 举报
回复
如果这样,实际上叫穷举要比BFS更合适,毕竟这和图论没有联系
pcboyxhy 2005-12-26
  • 打赏
  • 举报
回复
从 ZJU 上ZZ过来的
pcboyxhy 2005-12-26
  • 打赏
  • 举报
回复
#include<stdio.h>
int main()
{
int ca,cb,n,x,y;
while(scanf("%d %d %d",&ca,&cb,&n)!=-1)
{
x=y=0;
while(1)
{
printf("fill A\n");
x=ca;
if(x==n) {printf("success\n");break;}
while(x>0)
{
if((cb-y)>=x)
{
printf("pour A B\n");
y=y+x;
x=0;
}
else
{
printf("pour A B\n");
x=x-(cb-y);
y=cb;
}

if(x==n)
{
printf("success\n");
break;
}
if(y==n) break;
if(y==cb)
{
printf("empty B\n");
y=0;
}
}
if(x==n)
break;
if(y==n)
{
printf("success\n");
break;
}

}
}
return 0;
}
niuxiao 2005-12-26
  • 打赏
  • 举报
回复
但有不止一个人说用BFS求解,我不知道这个怎么和BFS扯上联系。。。
pcboyxhy 2005-12-26
  • 打赏
  • 举报
回复
基本上大多数问题都是可以BFS的
只要你不计较这个时间复杂度
这本来就是个不错的BFS问题

从当前状态搜索下一个节点的时候
可以进行的操作无非只有
fill
pour
empty

不断的扩展下去
总会找到解的
至于是否需要保存这个状态是另外回事


f_acme 2005-12-26
  • 打赏
  • 举报
回复
可以利用数论的知识
oo 2005-12-26
  • 打赏
  • 举报
回复
mark

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧