【萌新】pascal宽度优先搜索(BFS)倒油问题,求大神帮忙解决。
pascal吧
全部回复
仅看楼主
level 2
RT
自己检查了好几遍,不知道为什么有问题。
原问题:有10升油在10升的容器中,另有7升和3升的容器各一,,要求用这三个容器倒油,使得最后在10升和7升的容器中各有5升油,问最少倒几次。
自己写的源代码:(可能比较啰嗦,入门渣渣)
var judge:boolean;
p1,p2,st,st1,st2,i,num,x,y,gg,j,aa,bb,cc,dd,ee:longint;
space,oil,:array[0..10000,0..10000] of longint;
openy,ans,bt:array[0..10000] of longint;//bt数组是容积,oil是油量(可有可无没改),space是剩余空间;
function find(stx,sty:integer):boolean;
begin
find:=true;
for aa:=1 to p2 do
if (space[x,aa]=stx)and(space[y,aa]=sty) then
begin
find:=false;
exit;
end;
end;
function small(zz,zzz:integer):integer;//判断两个数的大小;
begin
if zz<=zzz then small:=zz
else small:=zzz;
end;
procedure out;//输出;
begin
writeln(openy[p1]+1);
halt;
end;
begin
space[1,1]:=0;
space[2,1]:=7;
space[3,1]:=3;
oil[1,1]:=10;
oil[2,1]:=0;
oil[3,1]:=0;
ans[1]:=5;
ans[2]:=5;
ans[3]:=0;
for i:=1 to 3 do
bt[i]:=oil[i,1]+space[i,1];
p1:=1;
p2:=1;
fillchar(openy,sizeof(openy),0);
while p1<=p2 do
begin
for x:=1 to 3 do
for y:=1 to 3 do
begin
st:=space[x,p1];
st1:=space[y,p1];
if (st<>0) and (x<>y) and (st1<>bt[y]) then
begin
st:=st-small(st,bt[y]-st1);
st1:=st1+small(st,bt[y]-st1);
end;
if (bt[x]-st=ans[x]) and (bt[y]-st1=ans[y]) then out;
if find(st,st1) then
begin
inc(p2);
space[x,p2]:=st;
space[y,p2]:=st1;
openy[p2]:=openy[p1]+1;
end;
end;
inc(p1);
end;
end.
输出的结果永远是1,也就是说它只做了一步以内的。
尝试检查了一下,发现在第一次倒油后st和st1两个变量都变成0了。
2017年02月07日 08点02分 1
level 1
dd
2017年02月07日 08点02分 2
level 9
我倒油不是这么写的
2017年02月07日 10点02分 5
level 2
呵呵
2017年02月08日 06点02分 24
level 2
谢各位吧友,已自行解决。
var judge:boolean;
p1,p2,st,st1,st2,i,num,x,y,gg,j,aa,bb,cc,dd,ee,sb:longint;
space,oil:array[0..10000,0..10000] of longint;
openy,ans,bt:array[0..10000] of longint;
function find(stx,sty:integer):boolean;
begin
find:=true;
for aa:=1 to p2 do
if (space[x,aa]=stx)and(space[y,aa]=sty) then
begin
find:=false;
exit;
end;
end;
function small(zz,zzz:integer):integer;
begin
if zz<=zzz then small:=zz
else small:=zzz;
end;
procedure out;
begin
writeln(openy[p1]+1);
halt;
end;
begin
space[1,1]:=0;
space[2,1]:=7;
space[3,1]:=3;
oil[1,1]:=10;
oil[2,1]:=0;
oil[3,1]:=0;
ans[1]:=5;
ans[2]:=5;
ans[3]:=0;
for i:=1 to 3 do
bt[i]:=oil[i,1]+space[i,1];
p1:=1;
p2:=1;
fillchar(openy,sizeof(openy),0);
while p1<=p2 do
begin
for x:=1 to 3 do
for y:=1 to 3 do
begin
st:=space[x,p1];
st1:=space[y,p1];
if (st<>0) and (x<>y) and (st1<>bt[y]) then
begin
sb:=st;
st:=st-small(sb,bt[y]-st1);
st1:=st1+small(sb,bt[y]-st1);
if (bt[x]-st=ans[x]) and (bt[y]-st1=ans[y]) then out;
if find(st,st1) then
begin
inc(p2);
space[x,p2]:=st;
space[y,p2]:=st1;
space[6-x-y,p2]:=space[6-x-y,p1];
openy[p2]:=openy[p1]+1;
end;
end;
end;
inc(p1);
end;
end.
2017年02月08日 07点02分 26
不用谢,自力更生,希望你赢取2017noip全国第一!
2017年02月08日 07点02分
@cjt266 。。。。[滑稽]
2017年02月08日 07点02分
level 1
var p1,p2:integer;
start,ans,huan:array[1..3,1..3] of integer;
tree,ha:array[1..1000] of integer;
put:array[1..3,1..3,1..1000] of integer;
st1,st2:integer;
st:integer;
i,j,k,l,x,y,a,b,x1,y1:integer;
tc:integer;
procedure print;
var i,j:integer;
begin
for i:=1 to 3 do
begin
for j:=1 to 3 do
write(huan[i,j]); writeln;
end;
writeln;
end;
procedure out2;
begin
writeln(tree[p1]+1);
halt;
end;
function out1(a:integer):boolean;
var r,q,t,p:integer;
begin
out1:=true;
begin
t:=0;
for q:=1 to 3 do
for p:=1 to 3 do
if ans[q,p]=put[q,p,p1] then t:=t+1;
if t=9 then
begin
out1:=false;
exit;
end;
end;
writeln(tree[p1]+1);
end;
function find:boolean;
begin
find:=true;
for i:=1 to p2 do
for j:=1 to 3 do
for l:=1 to 3 do
if huan[j,l]<>put[j,l,i] then ha[i]:=1;
for i:=1 to p2 do if ha[i]=0 then find:=false;
end;
begin
for i:=1 to 3 do
for j:=1 to 3 do
read(start[i,j]);
for i:=1 to 3 do
for j:=1 to 3 do
read(ans[i,j]);
for i:=1 to 3 do
for j:=1 to 3 do
put[i,j,1]:=start[i,j];
p1:=1;
p2:=1;
fillchar(tree,sizeof(tree),0);
while p1<=p2 do
begin
for i:=1 to 4 do
begin
for x:=1 to 3 do
for y:=1 to 3 do
begin
huan[x,y]:=put[x,y,p1];
if huan[x,y]=0 then
begin
x1:=x;
y1:=y;
end;
end;
if (i=1)and(x1+1<=3) then
begin huan[x1,y1]:=huan[x1+1,y1];huan[x1+1,y1]:=0;end else
if (i=2)and(x1-1>=1) then
begin huan[x1,y1]:=huan[x1-1,y1];huan[x1-1,y1]:=0;end else
if (i=3)and(y1+1<=3) then
begin huan[x1,y1]:=huan[x1,y1+1];huan[x1,y1+1]:=0;end else
if (i=4)and(y1-1>=1) then
begin huan[x1,y1]:=huan[x1,y1-1];huan[x1,y1-1]:=0;end;
if out1(i) then out2;
if find then
begin
inc(p2);
for x:=1 to 3 do
for y:=1 to 3 do
put[x,y,p2]:=huan[x,y];
tree[p2]:=tree[p1]+1;
print;
end;
end;
inc(p1);
end;
end.
帮我看下什么问题
2017年02月08日 08点02分 30
level 6
你们有见过这么整齐的十五个字吗
  我这十五字十分的标准不信你数数
  其实打十五字很容易的不信你试试
  十五字本来就很容易用得着学它么
  十五字是什么东西能够当做饭吃么
  其实我也不容易老是要打够十五字
  每天都在灌水经验却没怎么提升啊
  吧主不删我贴的话我也不用这样了
  每天都在别人的帖子发表都没用的
  所以自己发表了个新帖求个高手来
  其实十五个字也蛮容易打出来的嘛
  每天都在别的帖子灌水我都烦死了
  其实其他人的十五字我也很喜欢呢
  不过我打的十五字当然不能被超过
  在别人的帖子灌水我都不好意思了
  每天都那么多人说我是来打酱油的
  我都快晕死了为了经验要打十五字
  我开始还以为十五个字很难打的呢
  我勒个去想不到十五字那么容易打
  其实我也不容易啊每天都打这个呢
  发了那么多经验还是没怎么提升呢
  我都玩得很烦了十五字升级那么慢
  不过看到别人的十五字我又很高兴
  看了那么多还没看到有谁比我厉害
  今天看到了一个终于有得拼一下了
  不过拿十五字混经验真的有用的吗
  混了那么多怎么我的等级还那么低
  看到比人的等级那么高我又很不服
  没办法了为了超过别人只能这样了
  我很郁闷吧主为什么老是删我帖子
  难道我是在哪里得罪他老人家了吗
  其实十五个字打出来还蛮容易的呢
  唉天天都是这样就是为了找十五字
  天天都在贴吧呆着十五字倒很少见
  反正是多么无聊的帖子我都会灌水
  因为为了一句话万一这帖子火了呢
  有前排我就会占没前排也要灌水的
  说了那么多只是为了一点点的经验
  到现在我还没看到超过我的十五字
  在这里求个高手超越我打的十五字
  你们的那些十五字神马的都弱爆了
  现在灌水也要讲技术句句是十五字
  我可不是酱油党我只是为了捞经验
  最近看到有人抄袭我写的十五字了
  抄袭有意思么有本事就自己写去啊
  干嘛要复制我的我的十五字惹你啦
  真的是对于抄袭的我真的好无语了
  算了随便你们去了反正我会更新的
  一直被人模仿从来没有被人超越过
  在这里求十五字的高手来个我比比
  句句十五个字有哪个高手能超越呢
2017年02月09日 04点02分 34
level 6
你们有见过这么整齐的十五个字吗
  我这十五字十分的标准不信你数数
  其实打十五字很容易的不信你试试
  十五字本来就很容易用得着学它么
  十五字是什么东西能够当做饭吃么
  其实我也不容易老是要打够十五字
  每天都在灌水经验却没怎么提升啊
  吧主不删我贴的话我也不用这样了
  每天都在别人的帖子发表都没用的
  所以自己发表了个新帖求个高手来
  其实十五个字也蛮容易打出来的嘛
  每天都在别的帖子灌水我都烦死了
  其实其他人的十五字我也很喜欢呢
  不过我打的十五字当然不能被超过
  在别人的帖子灌水我都不好意思了
  每天都那么多人说我是来打酱油的
  我都快晕死了为了经验要打十五字
  我开始还以为十五个字很难打的呢
  我勒个去想不到十五字那么容易打
  其实我也不容易啊每天都打这个呢
  发了那么多经验还是没怎么提升呢
  我都玩得很烦了十五字升级那么慢
  不过看到别人的十五字我又很高兴
  看了那么多还没看到有谁比我厉害
  今天看到了一个终于有得拼一下了
  不过拿十五字混经验真的有用的吗
  混了那么多怎么我的等级还那么低
  看到比人的等级那么高我又很不服
  没办法了为了超过别人只能这样了
  我很郁闷吧主为什么老是删我帖子
  难道我是在哪里得罪他老人家了吗
  其实十五个字打出来还蛮容易的呢
  唉天天都是这样就是为了找十五字
  天天都在贴吧呆着十五字倒很少见
  反正是多么无聊的帖子我都会灌水
  因为为了一句话万一这帖子火了呢
  有前排我就会占没前排也要灌水的
  说了那么多只是为了一点点的经验
  到现在我还没看到超过我的十五字
  在这里求个高手超越我打的十五字
  你们的那些十五字神马的都弱爆了
  现在灌水也要讲技术句句是十五字
  我可不是酱油党我只是为了捞经验
  最近看到有人抄袭我写的十五字了
  抄袭有意思么有本事就自己写去啊
  干嘛要复制我的我的十五字惹你啦
  真的是对于抄袭的我真的好无语了
  算了随便你们去了反正我会更新的
  一直被人模仿从来没有被人超越过
  在这里求十五字的高手来个我比比
  句句十五个字有哪个高手能超越呢
2017年02月09日 04点02分 35
1