穿越栅栏
2017-02-24 19:39
288 查看
1272. 【USACO题库】2.4.2 Overfencing穿越栅栏 (Standard IO)
时间限制: 1000 ms 空间限制: 262144KB 具体限制 Goto ProblemSet题目描述
农夫John在外面的田野上搭建了一个巨大的用栅栏围成的迷宫。幸运的是,他在迷宫的边界上留出了两段栅栏作为迷宫的出口。更幸运的是,他所建造的迷宫是一个“完美的”迷宫:即你能从迷宫中的任意一点找到一条走出迷宫的路。给定迷宫的宽W(1<=W<=38)及长H(1<=H<=100)。2*H+1行,每行2*W+1的字符以下面给出的格式表示一个迷宫。然后计算从迷宫中最“糟糕”的那一个点走出迷宫所需的步数。(即使从这一点以最优的方式走向最靠近的出口,它仍然需要最多的步数)当然了,牛们只会水平或垂直地在X或Y轴上移动,他们从来不走对角线。每移动到一个新的方格算作一步(包括移出迷宫的那一步)这是一个W=5,H=3的迷宫:如上图的例子,栅栏的柱子只出现在奇数行或奇数列。每个迷宫只有两个出口。PROGRAM NAME: maze1输入
第一行: W和H(用空格隔开)第二行至第2*H+2行: 每行2*W+1个字符表示迷宫输出
输出一个单独的整数,表示能保证牛从迷宫中任意一点走出迷宫的最小步数。样例输入
5 3
样例输出
9
uses math; var a,b,c,d,q1,q2,ans,ans1,i:longint; v:array[1..100000,1..4]of longint; r:array[-1..300,-1..100]of char; p:array[-1..300,-1..100]of boolean; s:array[1..300]of string; const t:array[1..4,1..2]of longint=((-1,0),(0,-1),(1,0),(0,1)); begin readln(a,b); a:=2*a+1; b:=2*b+1; for c:=1 to b do begin readln(s[c]); for d:=1 to a do begin r[c,d]:=s[c][d]; end; end; fillchar(p,sizeof(p),true); for c:=1 to a do begin if (r[1,c]<>'-')and(r[1,c]<>'+')and(r[1,c]<>'|') then begin inc(q2); v[q2,1]:=2; v[q2,2]:=c; v[q2,3]:=1; v[q2,4]:=q2; p[2,c]:=false; end; if (r[b,c]<>'-')and(r[b,c]<>'+')and(r[b,c]<>'|') then begin inc(q2); v[q2,1]:=b-1; v[q2,2]:=c; v[q2,3]:=1; v[q2,4]:=q2; p[b-1,c]:=false; end; end; for c:=1 to b do begin if (r[c,1]<>'-')and(r[c,1]<>'+')and(r[c,1]<>'|') then begin inc(q2); v[q2,1]:=c; v[q2,2]:=2; v[q2,3]:=1; v[q2,4]:=q2; p[c,2]:=false; end; if (r[c,a]<>'-')and(r[c,a]<>'+')and(r[c,a]<>'|') then begin inc(q2); v[q2,1]:=c; v[q2,2]:=a-1; v[q2,3]:=1; v[q2,4]:=q2; p[c,a-1]:=false; end; end; while q1<q2 do begin inc(q1); for i:=1 to 4 do begin if (r[(v[q1,1]+t[i,1]),(v[q1,2]+t[i,2])]<>'-')and (r[(v[q1,1]+t[i,1]),(v[q1,2]+t[i,2])]<>'|')and (r[(v[q1,1]+t[i,1]+t[i,1]),(v[q1,2]+t[i,2]+t[i,2])]<>'-')and (r[(v[q1,1]+t[i,1]+t[i,1]),(v[q1,2]+t[i,2]+t[i,2])]<>'|')and (p[(v[q1,1]+t[i,1]+t[i,1]),(v[q1,2]+t[i,2]+t[i,2])]=true)and ((v[q1,1]+t[i,1]+t[i,1])in[1..b])and ((v[q1,2]+t[i,2]+t[i,2])in[1..a]) then begin inc(q2); v[q2,1]:=v[q1,1]+t[i,1]+t[i,1]; v[q2,2]:=v[q1,2]+t[i,2]+t[i,2]; v[q2,3]:=v[q1,3]+1; v[q2,4]:=v[q1,4]; p[v[q2,1],v[q2,2]]:=false; if v[q2,4]=1 then ans:=max(ans,v[q2,3]); if v[q2,4]=2 then ans1:=max(ans1,v[q2,3]); end; end; end; writeln(max(1,max(ans,ans1))); end.
相关文章推荐
- 穿越栅栏
- USACO 2.4.2 穿越栅栏
- Luogu P1519 穿越栅栏 Overfencing
- 【USACO2.4.2】穿越栅栏 BFS爆搜
- 第二次考试 (图论)第三题 穿越栅栏
- 【搜索】洛谷 P1519 穿越栅栏 Overfencing
- USACO 2.4.2 穿越栅栏(原题) 解题报告
- [USACO2.4]穿越栅栏 Overfencing
- USACO - 2.4.2 穿越栅栏(改编) 重庆一中高2018级竞赛班第二次测试 2016.7.13 Problem 3
- 【USACO题库】2.4.2 Overfencing穿越栅栏
- USACO2.4.2 穿越栅栏(简单版本) (重庆一中高2018级信息学竞赛测验2) 解题报告
- 【USACO2.4.2】穿越栅栏
- P1519 穿越栅栏 Overfencing
- 【7.13第三题】穿越栅栏【USACO2.4.2简单版本】
- USACO2.4.2 穿越栅栏
- 【USACO 2.4.2】穿越栅栏
- usaco2.4.3穿越栅栏(最短路)
- USACO 2.4.2改 穿越栅栏(多源bfs)
- 洛谷P1519 穿越栅栏 Overfencing
- usaco Overfencing 穿越栅栏(BFS)