1644: [Usaco2007 Oct]Obstacle Course 障碍训练课

时间:2022-05-08
本文章向大家介绍1644: [Usaco2007 Oct]Obstacle Course 障碍训练课,主要内容包括1644: [Usaco2007 Oct]Obstacle Course 障碍训练课、Description、Input、Output、Sample Input、Sample Output、HINT、Source、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

1644: [Usaco2007 Oct]Obstacle Course 障碍训练课

Time Limit: 5 Sec  Memory Limit: 64 MB

Submit: 383  Solved: 196

[Submit][Status][Discuss]

Description

考虑一个 N x N (1 <= N <= 100)的有1个个方格组成的正方形牧场。有些方格是奶牛们不能踏上的,它们被标记为了'x'。例如下图:

. . B x . . x x A . . . . x . . x . . . . . x . .

贝茜发现自己恰好在点A处,她想去B处的盐块舔盐。缓慢而且笨拙的动物,比如奶牛,十分讨厌转弯。尽管如此,当然在必要的时候她们还是会转弯的。对于一个给定的牧场,请你计算从A到B最少的转弯次数。开始的时候,贝茜可以使面对任意一个方向。贝茜知道她一定可以到达。

Input

第 1行: 一个整数 N 行

2..N + 1: 行 i+1 有 N 个字符 ('.', 'x', 'A', 'B'),表示每个点的状态。

Output

行 1: 一个整数,最少的转弯次数。

Sample Input

3 .xA ... Bx.

Sample Output

2

HINT

Source

Silver

题解:(HansBug:太开心啦,这道题我又逗比啦哈哈哈 wnjxyk:汗= =)

其实虽然这道题也是个BFS水题,但是和一般的走迷宫问题相比,这道题有个坑点——对于一个点先遍历到的未必是最优的,其实就算是当前最优也由于在本题中由于涉及方向问题,所以对后续来说也未必最优,而如果简单的灌水法的话,则会由于遍历过了而导致真正的最优值无法被更新

如,数据中的第5个点:

33 .......xA.....x.......x.......... ...x...........x.........x....... ........x.xx.....x.x............. .....x.....x.........x........... .....x................x.x........ ......x..x....x.........xx....... ...................x......x...... ...x.....x....................x.. ....x..........................x. x................................ ................................. .....x...x..x.................... .............................x... ...................x.........x... ...............x...x....x...x.... ..........xx.......x..x.......... ................................x ..............................xx. ..x...............x.x............ .x....x...............x....x....x ..x......xx.......x.x.......x.... ................x...xx.....x.x..x .x.............x........x...x.x.. .............................x.x. .........................x......x .....x.......x............xx...xx ........x....x.....xx.x.....xx.x. ...........x...x........x.x...xxB .x.x.x.............x...........x. x.............x................x. .........x.x.....x.....x.....x... ........x..............xx.....x.. ..............xx......x.x.....x..

(2,10)位置上最优值显然是1,而且无论怎么遍历都是1

但是(3,10)由于涉及来源于(2,10)的方向问题,所以很可能弄出个2作最优解,但事实上正解是1

说了这些就没了,继续AC

 1 /**************************************************************
 2     Problem: 1644
 3     User: HansBug
 4     Language: Pascal
 5     Result: Accepted
 6     Time:32 ms
 7     Memory:1728 kb
 8 ****************************************************************/
 9  
10 const dd:array[1..4,1..2] of longint=((1,0),(-1,0),(0,1),(0,-1));
11 var
12    i,j,k,l,m,n,x0,y0,x1,y1,f,r,x,y:longint;
13    b:array[0..205,0..205] of longint;
14    a:array[0..205,0..205] of longint;
15    d:array[0..100000,0..2] of longint;
16    ch:char;
17 function min(x,y:longint):longint;
18          begin
19               if x<y then min:=x else min:=y;
20          end;
21 function max(x,y:longint):longint;
22          begin
23               if x>y then max:=x else max:=y;
24          end;
25  
26 begin
27      readln(n);
28      fillchar(b,sizeof(b),0);
29      fillchar(a,sizeof(a),0);
30      for i:=0 to n+1 do
31          begin
32               b[0,i]:=1;
33               b[n+1,i]:=1;
34               b[i,0]:=1;
35               b[i,n+1]:=1;
36          end;
37      for i:=1 to n do
38          begin
39               for j:=1 to n do
40                   begin
41                        read(ch);
42                        case upcase(ch) of
43                             '.':b[i,j]:=0;
44                             'A':begin
45                                      x0:=i;y0:=j;
46                                      b[i,j]:=1;
47                             end;
48                             'B':begin
49                                      x1:=i;y1:=j;
50                                      b[i,j]:=0;
51                             end;
52                             'X':b[i,j]:=1;
53                        end;
54                   end;
55               readln;
56          end;
57      f:=1;r:=2;d[1,1]:=x0;d[1,2]:=y0;
58      a[x0,y0]:=1;a[x0,y0]:=1;a[x0,y0]:=1;a[x0,y0]:=1;
59      while f<r do
60            begin
61                 for i:=1 to 4 do
62                     begin
63                          x:=d[f,1];y:=d[f,2];
64                          while true do
65                                begin
66                                     x:=x+dd[i,1];
67                                     y:=y+dd[i,2];
68                                     if b[x,y]=1 then break;
69                                     l:=a[d[f,1],d[f,2]]+1;
70                                     if (l>=a[x,y]) and (a[x,y]>0) then continue;
71                                     a[x,y]:=l;
72                                     if (x=x1) and (y=y1) then
73                                        begin
74                                             writeln(a[x,y]-2);
75                                             readln;
76                                             halt;
77                                        end;
78                                     d[r,1]:=x;d[r,2]:=y;
79                                     inc(r);
80                                end;
81  
82                     end;
83                 inc(f);
84            end;
85 end.