【小白求教】BFS宽度优先搜索_倒水问题
pascal吧
全部回复
仅看楼主
level 5
nice传说yea 楼主
3杯子 从大到小容量分别是3 5 10 规则:1、三个杯子相互倒水且不准把水倒往三个杯子之外,2、每次倒水必须是把目标杯装满或是倒出水的杯子已空才能停止。
要求:给出各杯子的容量,请用最少的倒水次数,从C杯中倒出后,剩余d升水 输入D 输出次数
标准答案 @fp4869 我还记得你在暑假的那个培训班里[滑稽]是大神 @烈火电脑工作室
希望帮忙修改代码并且给出每一步每一句语句的思路 谢谢!
d=5 步骤=9
d=6 步骤=3
自行编写代码:
var
data:array[1..500,1..4] of longint;
bz:array[0..3,0..5,0..10] of boolean;
max:array[1..3] of longint=(3,5,10);
Shou,Wei,sum,i,j,x:longint;
begin
readln(x);
shou:=1;
wei:=2;
data[1,3]:=10; // 0 0 10
bz[0,0,10]:=true;
while shou<wei do
begin
for i:=1 to 3 do
for j:=1 to 3 do
begin
if i<>j then
begin
data[wei]:=data[shou]; //继承父节点
if (max[j]-data[shou,j])>=(data[shou,i]) then //如倒出的杯子能倒空
begin
data[wei,j]:=data[wei,j]+data[wei,i]; //接受杯子加上倒出杯子
data[wei,i]:=0; //倒出杯子清空
end
else //否则倒出的杯子不空
begin
data[wei,i]:=data[wei,i]-(max[j]-data[wei,j]);//倒出杯子减去能倒出的最大数量
data[wei,j]:=max[j]; //接收杯子满
end;
//判断是否合法
if bz[data[wei,1],data[wei,2],data[wei,3]]=false then
begin
bz[data[wei,1],data[wei,2],data[wei,3]]:=true; //标记
data[wei,4]:=data[shou,4]+1; //步骤
inc(wei);//父节点前推
end;
if data[wei-1,3]=x then //结束条件
begin
writeln(data[i,4]);
halt;
end;
end;
end;
inc(shou);
end;
end.
2014年10月20日 10点10分 1
level 5
nice传说yea 楼主
初始容量 0 0 10
2014年10月20日 10点10分 2
我好烦。。。[泪]要哭了
2014年10月20日 11点10分
回复 nice传说yea :救命[泪]
2014年10月20日 13点10分
level 5
nice传说yea 楼主

2014年10月20日 10点10分 3
level 5
nice传说yea 楼主
@wilyin 另外我是小学6年纪的[狂汗]是不是很垃圾
2014年10月20日 10点10分 4
level 13
一样年龄的问data什么用
2014年10月21日 11点10分 5
==数据库啊
2014年10月22日 08点10分
level 13
没事了
2014年10月21日 11点10分 6
level 5
nice传说yea 楼主
2014年10月22日 08点10分 7
1