早教吧作业答案频道 -->其他-->
求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迷宫路径广搜和...的网友还看了以下:
求解:1+1/3+1/9+1/27+...+1/3^2010用这个方法做:求1+5+5^2+5^3+ 2020-03-31 …
1+x+x的2次方+x的3次方+...+x的n次方+...(n接近无穷大)=s=(1-x的n次方) 2020-05-14 …
分数拆分:1/s(s-1)^3如题答案是-1/s+1/(s-1)-1/(s-1)^2+1/(s-1 2020-05-14 …
matlab如何同时画出两个图.我写的程序怎么不对啊这个程序是s=load('d:\1.txt') 2020-05-16 …
求函数的拉氏反变换:X(s)=(s+2)/[s·(s+1)^2·(s+3)]我的解法如下:X(s) 2020-05-22 …
拉普拉斯变换中极点与零点会不会重合(信号与系统)比如,对于(s+1)/(s^2-1)这个式子,是将 2020-06-04 …
我想请问S=VT=340M*S^(-1)*0.2S这里说的是声音传播速度是340M.时间是2S.我 2020-07-20 …
s=1/2*g*t^2(s为直线运动的距离s=1/2*g*t^2g为在地球上的加速度t为时间)s= 2020-07-22 …
设非空集合S={x丨m≤x≤l}满足:当x∈S时,有x²∈S,给出如下三个命题:①若m=1,则S= 2020-08-01 …
物体自由落体运动方程为s(t)=12gt2,若limn→∞s(1+△t)−s(1)△t=g=9.8m 2021-01-22 …