早教吧作业答案频道 -->其他-->
求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迷宫路径广搜和...的网友还看了以下:
已知a+b+c=1,求证:(a/1+b+c)+(b/1+a+c)+(c/1+a+b)≥3/5已知a 2020-04-05 …
已知A(1/3,1/a),B(1/4,1/b),C(1/5,1/c)满足a/(b+c)=1/3,b 2020-05-16 …
设a,b,c为满足a+b+c=1的正实数,证明:a3√1+b-c+b3√1+c-a+c3√1+a- 2020-05-16 …
不等式误区a,b,c都为正,a+b+c=1求1/a^2+1/b^2+1/c^2的最小值帮我看一下我 2020-06-06 …
[20分][高一不等式]已知a,b,c∈R+,且a+b+c=1,求证1/a+1/b+1/c≥9已知 2020-06-10 …
1.已知a,b,c∈R.a+b+c=1a²+b²+c²=1/2求证c≥02(1)已知a,c是正实数 2020-07-14 …
求X的取值范围?F(X)是R上的减函数,则满足F(1/X)>F(1)的X的取值范围是A.(-无穷, 2020-07-19 …
高二数学题,帮忙解决,要步骤的(1)设a,b,c属于R,a+b+c=0,abc0.(2)设a,b, 2020-07-22 …
1.已知(a+b-c-1)(a-b+c-1)=(A+B)(A-B),则A=B=2.已知A=a^3- 2020-07-24 …
设a,b,c都是正数且a+b+c=1,求证:(1+a)(1+b)(1+c)≥8(1-a)(1-b) 2020-07-25 …