题目
当WJ醒来时,发现自己被困在一个地图的左上角,幸好WJ有张图,并了解到出口正是迷宫的右下角,至少有一条路径可以到达出口。
整个地图有些地方会有障碍(保证左上角右下角没有),WJ可以快速奔跑,只是需要拐弯时令人很不爽。为了保持心情愉悦,WJ想知道最少需要几次转弯。
题解
最少转弯问题,与迷宫问题类似,可用广搜解决
由于要求转弯次数最少,每次走都要一直走到不能走为止,经过的点都入队,可证先到的点一定最优
时间复杂度O(n2)
代码
const
dx:array[1..4]of integer=(1,-1,0,0);
dy:array[1..4]of integer=(0,0,-1,1);
var
r,c,i,j,k:longint;
s:char;
a:array[0..501,0..501,1..2]of longint;
state:array[1..250000,1..2]of longint;
procedure bfs;
var
i,j,k,head,tail,x,y,x1,y1:longint;
begin
head:=0;tail:=1;state[1,1]:=1;state[1,2]:=1;a[1,1,1]:=2;
repeat
inc(head);
x:=state[head,1];y:=state[head,2];
for i:=1 to 4 do
if (a[x+dx[i],y+dy[i],1]=1) then
begin
x1:=x+dx[i];y1:=y+dy[i];
while a[x1,y1,1]=1 do
begin
inc(tail);
state[tail,1]:=x1;
state[tail,2]:=y1;
a[x1,y1,1]:=2;
a[x1,y1,2]:=a[state[head,1],state[head,2],2]+1;
x1:=x1+dx[i];y1:=y1+dy[i];
end;
end;
until head=tail;
end;
begin
assign(input,'escape.in');
assign(output,'escape.out');
reset(input);
rewrite(output);
readln(r,c);
for i:=1 to r do
begin
for j:=1 to c do
begin
read(s);
if s='0' then a[i,j,1]:=1;
end;
readln;
end;
bfs;
writeln(a[r,c,2]-1);
close(input);close(output);
end.