迷宫 pascal 深度优先搜索

现在以这题来举例(迷宫)
1 1 1 1
0 1 0 1
0 1 0 1
0 1 1 1
记录起点为(startx,starty)找到所有的到(endx,endy)的路径.
startx,starty,endx,endy要求输入,假定 (startx,starty)、(endx,endy)都为1。
我的程序老是只找到一条路径,求解决。
program BFS_PROJECT;
const
cx:array[1..4]of shortint=(0,0,1,-1);
cy:array[1..4]of shortint=(1,-1,0,0);
var m, endx, endy, startx, starty, t, i, j, k : byte;
a:array[1..100,1..100]of byte;
n:array[1..100]of byte;
procedure scanf;//输入
begin
readln(t);
write('start.x,start.y:'); readln(startx,starty);
write(' end.x, end.y:'); readln( endx, endy);
writeln('迷宫:');
for i := 1 to t do for j := 1 to t do read(a[i, j]);
end;
procedure dfs(x, y : shortint);//深度搜索
begin
if(x > 0)and(x < 5)and(y > 0)and(y < 5)then
if a[x,y] = 1 then
begin
a[x,y] := 2;
if(x = endx) and (y = endy)then
begin
writeln('-----------');
for i:=1 to t do
begin
for j:=1 to t do write(a[i,j], ' '); writeln;
end; inc(m);
end
else for i := 1 to 4 do dfs(x + cx[ i ],y + cy[ i ]);
a[x,y] := 1;
end;
end;
begin//主程序
scanf; dfs(startx, starty);
writeln('-----------'); writeln(m);//输出
end.
如果可以,一定要加分!!!!!!!!!!

这个……楼主啊,你是新学Pascal的?
虽然有点失敬,但我还是要指出,你没有理解递归和回溯的真正意义和它的用法……
首先纠正深搜是Depth First Search 是DFS楼主这个程序名嘛……
还有就是要区分局部变量和全局变量,总之楼主差的有点多。不是三言两语就能解释清的。
谨此附上我的程序,可能算法有些啰嗦,但是还是可行的。我的变量名和格式都是尽量按照楼主的格式来的。所以理解起来好点,希望对你有帮助。

Program DFS;
Const
go:array[1..4,1..2] of integer=((-1,0),(1,0),(0,-1),(0,1));
Var
m,endx,endy,startx,starty,t,i,j,k,c:integer;
a:array[0..101,0..101] of integer;
v:array[0..101,0..101] of boolean;

Procedure Scanf;
Begin
readln(t);
write('start.x,start.y:');readln(startx,starty);
write(' end.x, end.y:');readln(endx,endy);
writeln('Migong');
for i:=1 to t do
begin
for j:=1 to t do
read(a[i,j]);
readln;
end;

For i:=0 to t+1 do
Begin
a[0,i]:=maxint;
a[t+1,i]:=maxint;
a[i,0]:=maxint;
a[t+1,i]:=maxint;
End;

fillchar(v,sizeof(v),false);
c:=2;
End;

Procedure Dfs(x,y:integer);
Var
i:integer;
Begin
if (a[x,y]=maxint) or (a[x,y]=0) or v[x,y] then exit;

v[x,y]:=true;

if (x=endx) and (y=endy) then
begin
writeln('--------');
inc(m);

for i:=1 to t do
begin
for j:=1 to t do
if v[i,j] then write(c,' ') else write(a[i,j],' ');
writeln;
end;
v[x,y]:=false;
inc(c);
exit;
end;

for i:=1 to 4 do
dfs(x+go[i,1],y+go[i,2]);

v[x,y]:=false;
End;

Begin
scanf;
dfs(startx,starty);
writeln('----------');
writeln(m);
End.
温馨提示:答案为网友推荐,仅供参考
相似回答