2017.8.7测试 题四 WJ的逃离

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.
//附本人写的第一篇广搜博客,有超多注释,也算是模板了吧:传送门

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值