tyvjp1030乳草的入侵

最近刚听的...虽然不是萧敬腾的原唱 但是觉得还挺不错 分享下思密达~

31# 乳草的入侵

背景

USACO OCT09 6TH

描述

Farmer John一直努力让他的草地充满鲜美多汁的而又健康的牧草。可惜天不从人愿,他在植物大战人类中败下阵来。邪恶的乳草已经在他的农场的西北部份佔领了一片立足之地。 草地像往常一样,被分割成一个高度為Y(1 <= y <= 100), 宽度為X(1 <= x <= 100)的直角网格。(1,1)是左下角的格(也就是说坐标排布跟一般的X,Y坐标相同)。乳草一开始佔领了格(Mx,My)。每个星期,乳草传播到已被乳草佔领的格子四面八方的每一个没有很多石头的格(包括垂直与水平相邻的和对角线上相邻的格)。1周之后,这些新佔领的格又可以把乳草传播到更多的格裡面了。 Bessie想要在草地被乳草完全佔领之前尽可能的享用所有的牧草。她很好奇到底乳草要多久才能佔领整个草地。如果乳草在0时刻处於格(Mx,My),那麼还在那个时刻它们可以完全佔领入侵整片草地呢(对给定的数据总是会发生)? 草地由一个图片表示。"."表示草,而"*"表示大石。比如这个X=4, Y=3的例子。
....
..*.
.**.
如果乳草一开始在左下角(第1排,第1列),那麼草地的地图将会以如下态势发展:
      ....  ....  MMM.  MMMM  MMMM  
      ..*.  MM*.  MM*.  MM*M  MM*M  
      M**.  M**.  M**.  M**.  M**M  
星期数  0     1     2     3     4
乳草会在4星期后佔领整片土地。

输入格式

  • 第一行: 四个由空格隔开的整数: X, Y, Mx, My
  • 第2到第Y+1行: 数据的第y1行由X个字符("."表示草地,"*"表示大石),描述草地的
第(Y+2-y)行。

输出格式

  • 第一行: 一个单独的整数表示最后一个不是大石块的格子被乳草佔领的星期数。

样例输入

4 3 1 1
....
..*.
.**.

样例输出

4

时间限制

各个测试点1s 题解:裸的BFS  floodfill问题  纯当练习虐一虐 ...注意是八个方向扩展 然后坐标别弄错【和我似的...调了好久 发现跪给坐标了】

Delphi语言: 高亮代码由发芽网提供

program tyvj1030; type node=record x,y,time:longint; end; var d:array[1..8] of  integer=(1,0,-1,0,1,-1,1,-1); l:array[1..8] of integer= (0,-1,0,1,-1,1,1,-1); a:array[0..101,0..101] of longint; q:array[1..10000] of node; head,tail,i,j,x,y,mx,my,ans:longint; k:node; ch:string; procedure push(x,y,t:longint); begin inc(head); q[head].x:=x;q[head].y:=y;q[head].time:=t; end; function pop:node; begin pop:=q[tail]; inc(tail); end; begin fillchar(a,sizeof(a),2); readln(x,y,mx,my); for j:=y downto 1 do begin readln(ch); for i:=1 to x do case ch[i] of '.':a[i,j]:=1; '*':a[i,j]:=2; end; end; a[mx,my]:=3; head:=0;tail:=1; push(mx,my,0); ans:=0; while head>=tail do begin k:=pop; if k.time>ans then ans:=k.time; for i:=1 to 8 do if a[k.x+d[i],k.y+l[i]]=1 then begin a[k.x+d[i],k.y+l[i]]:=3; push(k.x+d[i],k.y+l[i],k.time+1); end; end; writeln(ans); end.

posted on 2012-10-15 20:19  馒头~blue  阅读(336)  评论(0)    收藏  举报

导航