WJ的逃离
escape
【题目描述】
当WJ醒来时,发现自己被困在一个地图的左上角,幸好WJ有张图,并了解到出口正是迷宫的右下角,至少有一条路径可以到达出口。
整个地图有些地方会有障碍(保证左上角右下角没有),WJ可以快速奔跑,只是需要拐弯时令人很不爽。为了保持心情愉悦,WJ想知道最少需要几次转弯。
【输入数据】
第一行两个数r,c表示地图大小
接下来r行,每行c个字符,‘*’代表此处有障碍,‘0’代表空地。
【输入样例】
escape.in
2 5
0*000
000*0
【输出格式】
一个数,表示最少需要几次转弯。数据保证有解。
【输出样例】
escape.out
4
【数据范围】
对于20%的数据,r、c≤10;
对于40%的数据,r、c≤100;
对于100%的数据,r、c≤500。
题解(以后要习惯这么写了,洛谷不收有注释没结题报告的了):本题其实是个广搜,因为广搜是最快找到的路是最短的路,所以只要一找到就输出就行了。
const
dx:array [1..4] of integer=(-1,0,1,0);
dy:array [1..4] of integer=(0,1,0,-1);
var
a,v:array[0..500,0..500]of boolean;
f:array[0..250000]of longint;
b:array[0..250000,1..2]of longint;
r,c,i,j:longint;
z:char;
function check(x,y:longint):boolean;
begin
if (x<1) or (x>r) or (y<1) or (y>c) or (a[x,y]) then exit(false);//判断有没有越界或这个地方能不能走(障碍)
exit(true);
end;
procedure try;
var
i,h,t,x,y:longint;
begin
h:=0;t:=1;
b[1,1]:=1;//一开始从(1,1)开始走(此为x坐标)
b[1,2]:=1;//这就是y啦~
f[1]:=0;//一开始不用转弯
while h<t do
begin
inc(h);
for i:=1 to 4 do
begin
x:=b[h,1]+dx[i];
y:=b[h,2]+dy[i];
while check(x,y) do
begin
if not v[x,y] then//没走过
begin
v[x,y]:=true;
inc(t);
f[t]:=f[h]+1;//为下一次转弯做准备(转弯+1)
b[t,1]:=x;
b[t,2]:=y;
if (b[t,1]=r) and (b[t,2]=c) then//走到终点了
begin
write(f[t]-1);//到了就不用转啦
halt;
end;
end;
x:=x+dx[i];
y:=y+dy[i];
end;
end;
end;
end;
begin
readln(r,c);
for i:=1 to r do
begin
for j:=1 to c do
begin
read(z);
if z='*' then a[i,j]:=true;
end;
readln;
end;
try;
end.
//附本人写的第一篇广搜博客,有超多注释,也算是模板了吧:传送门