早教吧作业答案频道 -->其他-->
求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)处。
这是实验心理学中的一个经典问题,心理学家把一只老鼠从一个无顶盖的大盒子的入口处赶进迷宫。迷宫中设置很多隔壁,对前进方向形成了多处障碍,心理学家在迷宫的唯一出口处放置了一块奶酪,吸引老鼠在迷宫中寻找通路以到达出口。
迷宫以一个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.
请采纳!
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.
请采纳!
看了 求pascal迷宫路径广搜和...的网友还看了以下:
如图所示是某个同学做“探究光对鼠妇生活的影响”的实验装置.实验过程式中,他将10只鼠妇放入此装置的中 2020-11-25 …
照射处和阴暗处水寻找一个带有橡皮塞的小瓶子,往里面灌满水后,在橡皮塞中间插入一根很细的吸管,将这一装 2020-12-07 …
以下是某班同学设计“探究影响鼠妇生活的环境因素”的实验方案:在实验装置中央放入10只鼠妇,静置5分钟 2020-12-07 …
以下是某班同学设计的“探究影响鼠妇生活的环境因素”实验方案:在实验装置中央放入10只鼠妇,静置5分钟 2020-12-07 …
以下是某班同学设计的“探究影响鼠妇生活的环境因素”实验方案:在实验装置两侧中央各放入5只鼠妇,静置5 2020-12-07 …
实验探究(6分)以下是某班同学设计的“探究影响鼠妇生活的环境因素”实验方案:实验装置:在实验装置中央 2020-12-07 …
以下是某班同学在探究“光对鼠妇生活有影响吗?”实验中,所设计实验装置:他在实验装置中央放入10只鼠妇 2020-12-07 …
以下是某班同学设计的“探究影响鼠妇生活的环境因素”实验方案,在实验装置中央放入10只鼠妇,静置5分钟 2020-12-07 …
如图是某市区矗立的噪声监测及分贝数显示装置.从装置上显示的分贝数可知()A.此处的噪声能使人失去听力 2020-12-26 …
如图是某市区矗立的噪声监测及分贝数显示装置.从装置上显示的分贝数可知()A.此处的噪声能使人失去听力 2020-12-26 …