不知道正解是啥,反正我还是一如既往的逗比——以地图上每个+符号(S、E也算)为节点,建立无向图,然后就成了求最短路径的问题了,然后就是神烦的边spfa边记录路径了,话说这道水题居然写了我好久唉TT
1 /**************************************************************
2 Problem: 1687
3 User: HansBug
4 Language: Pascal
5 Result: Accepted
6 Time:32 ms
7 Memory:2600 kb
8 ****************************************************************/
9
10 const dir:array[1..4] of char=(‘N‘,‘E‘,‘S‘,‘W‘);
11 type
12 point=^node;
13 node=record
14 g,w,q:longint;
15 next:point;
16 end;
17 var
18 i,j,k,l,m,n,x0,y0,x1,y1,x,y,f,r,s,t,v:longint;
19 map:array[0..100,0..100] of longint;
20 a:array[0..10000] of point;
21 b,c,g:array[0..10000] of longint;
22 d:array[0..100000] of longint;
23 e,h:array[0..100000,1..2] of longint;
24 ch:char;
25 p:point;
26 procedure add(x,y,z,t:longint);
27 var p:point;
28 begin
29 new(p);p^.g:=y;p^.w:=z;
30 p^.q:=t;p^.next:=a[x];a[x]:=p;
31 end;
32 begin
33 fillchar(map,sizeof(map),0);
34 readln(n,m);
35 n:=n*2-1;m:=m*2-1;
36 for i:=1 to n do
37 begin
38 for j:=1 to m do
39 begin
40 read(ch);
41 case upcase(ch) of
42 ‘S‘:begin
43 map[i,j]:=-1;
44 x0:=i;y0:=j;
45 end;
46 ‘E‘:begin
47 map[i,j]:=-1;
48 x1:=i;y1:=j;
49 end;
50 ‘.‘:map[i,j]:=0;
51 ‘-‘:map[i,j]:=-2;
52 ‘|‘:map[i,j]:=-3;
53 ‘+‘:map[i,j]:=-1;
54 end;
55 end;
56 readln;
57 end;
58 s:=0;t:=0;v:=0;
59 for i:=1 to n do
60 for j:=1 to m do
61 if map[i,j]=-1 then
62 begin
63 inc(v);
64 map[i,j]:=v;
65 if (x0=i) and (y0=j) then s:=v;
66 if (x1=i) and (y1=j) then t:=v;
67 end;
68 for i:=1 to n do
69 for j:=1 to m do
70 begin
71 if map[i-1,j]<>0 then
72 begin
73 x:=i-1;y:=j;
74 while map[x,y]=-3 do dec(x);
75 if map[x,y]>0 then add(map[i,j],map[x,y],1,1);
76 end;
77 if map[i+1,j]<>0 then
78 begin
79 x:=i+1;y:=j;
80 while map[x,y]=-3 do inc(x);
81 if map[x,y]>0 then add(map[i,j],map[x,y],1,3);
82 end;
83 if map[i,j-1]<>0 then
84 begin
85 x:=i;y:=j-1;
86 while map[x,y]=-2 do dec(y);
87 if map[x,y]>0 then add(map[i,j],map[x,y],1,4);
88 end;
89 if map[i,j+1]<>0 then
90 begin
91 x:=i;y:=j+1;
92 while map[x,y]=-2 do inc(y);
93 if map[x,y]>0 then add(map[i,j],map[x,y],1,2);
94 end;
95 end;
96 fillchar(g,sizeof(g),0);
97 fillchar(c,sizeof(c),0);
98 fillchar(b,sizeof(b),0);
99 fillchar(e,sizeof(e),0);
100 d[1]:=s;f:=1;r:=2;g[s]:=1;c[s]:=1;
101 while f<r do
102 begin
103 p:=a[d[f]];
104 while p<>nil do
105 begin
106 if (c[p^.g]=0) or ((c[p^.g]>0) and (c[p^.g]>(c[d[f]]+p^.w))) then
107 begin
108 c[p^.g]:=c[d[f]]+p^.w;
109 b[p^.g]:=d[f];
110 e[p^.g,1]:=p^.q;e[p^.g,2]:=p^.w;
111 if g[p^.g]=0 then
112 begin
113 g[p^.g]:=1;
114 d[r]:=p^.g;
115 inc(r);
116 end;
117 end;
118 p:=p^.next;
119 end;
120 inc(f);
121 g[d[f]]:=0;
122 end;
123 for i:=1 to v do dec(c[i]);
124 i:=0;fillchar(h,sizeof(h),0);
125 while t<>0 do
126 begin
127 inc(i);
128 h[i,1]:=e[t,1];
129 h[i,2]:=e[t,2];
130 t:=b[t];
131 end;
132 v:=i-1;
133 for i:=1 to v div 2 do
134 begin
135 j:=h[i,1];h[i,1]:=h[v+1-i,1];h[v+1-i,1]:=j;
136 j:=h[i,2];h[i,2]:=h[v+1-i,2];h[v+1-i,2]:=j;
137 end;
138 inc(v);h[v,1]:=5;h[v,2]:=0;
139 j:=h[1,1];k:=h[1,2];
140 for i:=2 to v do
141 begin
142 if h[i,1]=j then
143 k:=k+h[i,2]
144 else
145 begin
146 writeln(dir[j],‘ ‘,k);
147 k:=h[i,2];j:=h[i,1];
148 end;
149 end;
150 readln;
151 end.