用递规完成回溯,源程序如下,最终执行结果,此题无解 var gezi : array [1..5,1..5] of Integer; x,y,count :Integer; function go(AX,AY:Integer):Boolean; begin if(x+AX < 1)or(x+AX >5)or(y+AY < 1)or(Y+AY >5)then begin result := false; Exit; end; if(gezi[x+AX,y+AY]<>0)then begin result := false; Exit; end; x := x + AX; y := y + AY; count := count + 1; gezi[x,y] := count; if(go(-1,0))then begin result := true; Exit; end; if(go(1,0))then begin result := true; Exit; end; if(go(0,1))then begin result := true; Exit; end; if(go(0,-1))then begin result := true; Exit; end; if(count = 24) then result := true else begin count := count -1; gezi[x,y] := 0; x := x - AX; y := y - Ay; result := false; end; end;procedure TForm1.Button2Click(Sender: TObject); var i,j : Integer; begin for x := 1 to 5 do begin for y := 1 to 5 do begin for i := 1 to 5 do begin for j := 1 to 5 do begin gezi[i,j] := 0; end; end; gezi[5,2] := 25; count :=0; gezi[x,y] := 1; if(go(-1,0))then begin showmessage('ok'); Exit; end; if(go(1,0))then begin showmessage('ok'); Exit; end; if(go(0,-1))then begin showmessage('ok'); Exit; end; if(go(0,1))then begin showmessage('ok'); Exit; end; end; end; showmessage('no answer'); end;
做一个函数fun(x,y)
该函数是一个递归函数,
{
每一次判断有几种走法,据题意不超过四种,同时的判断不要越界,即只能在0-4徘徊,其不能有
走过的,然后循环递归,走不动时返回路线
}调用该函数时传入参数x,y 需循环传入,对每一个可能的点
一直到第一排(行)的第一个,
往下到第一列的最后一个,
往右到最后一行的第一个,
往上到最后一列的第五个,也就是不能走的那一个的下面第三个,
往内走一个,到第24列的第五个,
往下沿来路一直回到第二列的第五个,
往内走一个到第三列的第五个,
往下沿来路到第23列的第五个,
如果循环直到第五行以下的全部走完,从第五行的第14个上面,
往上一个,
往左到第四行第二个,
往上一个,
右一个,
下一个,
直到第二行第14个,
右一个,
下两个,
右一个,
上两个,
直到第四行的第24个,
再右一个,上一个从第三行的第25个出来。
我用Excel走过n遍!
语义描述如下:乙说谎 -〉 (乙)=0
一个子分枝描述如下:
条件:起点,甲不说谎 (甲)=1
begin
第一次判断(甲言):(乙)=0
第二次判断(乙言):not( (甲)=0;(丙)=0)
等同:(甲)=1;(丙)=1 (没有产生矛盾)
第三次判断(丙言):(甲)=0
与起始条件产生矛盾,假设错误。
end;
第二次判断时,加上"not"是根据第一次判断的结果((乙)=0)得出的。
同样,第三次判断,不加"not"是根据第二次判断结果定出的。
这样,经过最多6次(3*2)判断,就可以找到最後的正确逻辑,然后根据正确逻辑分配“鱼”我想一定难不倒大家的。 好了,以上都是纸上谈兵,见笑。但是,应该还是有一点道理的,大家多提提意见。
哪有25列啊?
一共才5行5列
var
gezi : array [1..5,1..5] of Integer;
x,y,count :Integer;
function go(AX,AY:Integer):Boolean;
begin
if(x+AX < 1)or(x+AX >5)or(y+AY < 1)or(Y+AY >5)then
begin
result := false;
Exit;
end;
if(gezi[x+AX,y+AY]<>0)then
begin
result := false;
Exit;
end;
x := x + AX;
y := y + AY;
count := count + 1;
gezi[x,y] := count;
if(go(-1,0))then
begin
result := true;
Exit;
end;
if(go(1,0))then
begin
result := true;
Exit;
end;
if(go(0,1))then
begin
result := true;
Exit;
end;
if(go(0,-1))then
begin
result := true;
Exit;
end;
if(count = 24)
then result := true
else begin
count := count -1;
gezi[x,y] := 0;
x := x - AX;
y := y - Ay;
result := false;
end;
end;procedure TForm1.Button2Click(Sender: TObject);
var
i,j : Integer;
begin
for x := 1 to 5 do
begin
for y := 1 to 5 do
begin
for i := 1 to 5 do
begin
for j := 1 to 5 do
begin
gezi[i,j] := 0;
end;
end;
gezi[5,2] := 25;
count :=0;
gezi[x,y] := 1;
if(go(-1,0))then
begin
showmessage('ok');
Exit;
end;
if(go(1,0))then
begin
showmessage('ok');
Exit;
end;
if(go(0,-1))then
begin
showmessage('ok');
Exit;
end;
if(go(0,1))then
begin
showmessage('ok');
Exit;
end;
end;
end;
showmessage('no answer');
end;
有解你到是说呀