8.7 WJ的逃离escape 2537

来源:互联网 发布:淘宝选款技巧 编辑:程序博客网 时间:2024/06/07 00:18

  • 题目
  • 题解
  • 代码

题目

当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.
原创粉丝点击