题目描述
两只牛在森林里故意走丢了。农民John开始用他的专家技术追捕这两头牛。你的任务是模拟他们的行为(牛和John)。
追击在10x10的平面网格内进行。一个格子可以是:
一个障碍物,
两头牛(它们总在一起), 或者
农民John.
两头牛和农民John可以在同一个格子内(当他们相遇时),但是他们都不能进入有障碍的格子。
一个格子可以是:
. 空地
障碍物C 两头牛
F 农民John
这里有一个地图的例子::
……..
……*…
……..
……….
…*.F….
…..…
…*……
..C……*
….….
..……
牛在地图里以固定的方式游荡。每分钟,它们可以向前移动或是转弯。如果前方无障碍且不会离开地图,它们会按照原来的方向前进一步。否则它们会用这一分钟顺时针转90度。
农民John, 深知牛的移动方法,他也这么移动。
每次(每分钟)农民John和两头牛的移动是同时的。如果他们在移动的时候穿过对方,但是没有在同一格相遇,我们不认为他们相遇了。当他们在某分钟末在某格子相遇,那么追捕结束。开始时,John和牛都面向北方。
PROGRAM NAME: ttwo
INPUT FORMAT
Lines 1-10:
每行10个字符,表示如上文描述的地图。
SAMPLE INPUT (file ttwo.in)
……..
……*…
……..
……….
…*.F….
…..…
…*……
..C……*
….….
..……
OUTPUT FORMAT
输出一个数字,表示John需要多少时间才能抓住牛们。输出0,如果John无法抓住牛。
SAMPLE OUTPUT (file ttwo.out)
49
输入
输出
样例输入
样例输出
数据范围限制
好吧手懒很久没更博客了,OI渣渣表示进不了省选……
思路: 纯模拟 为了美观点决定用dfs(然而模拟思路没区别) dfs注意步数累加过6210+会傻掉,判断即可
代码:
var a:array[0..11,0..11]of longint; n,i,j,x0,y0,x1,y1:longint; ch:char; procedure readin; var s:string; begin for i:=0 to 11 do begin a[i,0]:=1; a[0,i]:=1; a[i,11]:=1; a[11,i]:=1; end; for i:=1 to 10 do begin readln(s); for j:=1 to 10 do begin ch:=s[j]; if ch='F'then begin x0:=i; y0:=j; end; if ch='C'then begin x1:=i; y1:=j; end; if ch='*'then begin a[i,j]:=1; end; end; end; end; procedure change(var x,y,v:longint); var i,j:longint; begin i:=x; j:=y; case v of 1:dec(i); 2:inc(j); 3:inc(i); 4:dec(j); end; if a[i,j]<>1 then begin x:=i; y:=j; end else begin if v<>4 then inc(v) else v:=1; end; end; procedure doit(x0,y0,xx,x1,y1,yy,v:longint); begin if v>6200 then begin writeln(0); halt; end; change(x0,y0,xx); change(x1,y1,yy); if (x0=x1)and(y0=y1)then begin writeln(v+1); halt; end else doit(x0,y0,xx,x1,y1,yy,v+1); end; begin readin; doit(x0,y0,1,x1,y1,1,0); end.