早教吧 育儿知识 作业答案 考试题库 百科 知识分享

求pascal迷宫路径广搜和深搜程序!(详细问题请看10.153.3.180的problem)这是实验心理学中的一个经典问题,心理学家把一只老鼠从一个无顶盖的大盒子的入口处赶进迷宫。迷宫中设置很多隔壁

题目详情
求pascal迷宫路径广搜和深搜程序!(详细问题请看10.153.3.180的problem)
这是实验心理学中的一个经典问题,心理学家把一只老鼠从一个无顶盖的大盒子的入口处赶进迷宫。迷宫中设置很多隔壁,对前进方向形成了多处障碍,心理学家在迷宫的唯一出口处放置了一块奶酪,吸引老鼠在迷宫中寻找通路以到达出口。
  迷宫以一个01矩阵表示,0表示通路,1表示不通,入口在座标(1,1),出口在(m,n),m表示行,n表示列。老鼠在某一格子时,可以向周围8个格子移动(只要目的格子不为1或没有超出边界)。现求解出到达出口的最少移动步数,注:站在(m,n)即表示已经抵达出口,起始时老鼠站在(1,1)处。
▼优质解答
答案和解析
const
dx:array[1..8] of integer=(0,1,1,1,0,-1,-1,-1);// 行坐标增量
dy:array[1..8] of integer=(1,1,0,-1,-1,-1,0,1);// 列坐标增量
var
n,m:integer;// 迷宫长和宽
maze:array[1..100,1..100] of integer;// 迷宫
visited:array[1..100,1..100] of boolean;// 标记迷宫中某一位置是否被访问过
qx,qy,qz:array[1..10000] of integer;// 三个队列
rear,front:integer;// 队头和队尾的指针
found:boolean;// 是否搜索到出口
i,j:integer;
tx,ty,tz,kx,ky,kz:integer;
{入队}
procedure push(a,b,c:integer);
begin
rear:=rear+1;
qx[rear]:=a;
qy[rear]:=b;
qz[rear]:=c;
end;
{出队}
procedure pop(var a,b,c:integer);
begin
front:=front+1;
a:=qx[front];
b:=qy[front];
c:=qz[front];
end;
{主函数}
begin
{读入数据}
readln(n,m);
for i:=1 to n do
begin
for j:=1 to m do
read(maze[i,j]);
readln;
end;
{完成一些初始化工作}
rear:=0;
front:=0;
fillchar(visited,sizeof(visited),false);
found:=false;
{起始位置入队}
push(1,1,0);
while(rear<>front)do
begin
if found then break;
{每次循环先取一个队头数据}
pop(tx,ty,tz);
//writeln(tx,' ',ty,' ',tz);
{判断当前位置相邻的8个位置}
for i:=1 to 8 do
begin
kx:=tx+dx[i];
ky:=ty+dy[i];
kz:=tz+1;
{如果已经找到出口,就设置标志位,然后退出循环}
if (kx=n) and (ky=m)
then begin
found:=true;
break;
end;
{位置(kx,ky)是否在迷宫内,并且可通过,同时没有被访问过}
if (kx>0) and (ky>0) and (kx<=n) and (ky<=m) and (maze[kx][ky]=0) and (not visited[kx][ky])
then begin
push(kx,ky,kz);
visited[kx][ky]:=true;
end
end
end;
if found then writeln(kz)
else writeln('no');
end.
请采纳!