题四 遭遇战
(fight.* )
【问题描述】
mxy 沉迷于一个辣鸡游戏不可自拔。
游戏地图是一个 n*n 的矩形,左上角为(0,0),右下角为(n-1,n-1)。mxy 与对手同时
进入地图的随机位置,并以相同速度进行走位。为了隐蔽性,两人都不会再走自己走过的
格子。如果两人向某一方向前进,那么他们会跑到不能跑为止,当不能跑的时候,mxy 会
向右转,对手则会向左转,如果不能跑,则不再动。
现在告诉你两人进入地图的初始位置和方向,请算出两人遭遇的位置。(不遭遇输出-1)
【输入】
第一行一个整数 t,表示数据组数。(1≤t≤10)
接下来 t 组数据,每组数据的第一行包含一个整数 n。(1≤n≤1000)
第二行包含三个整数 x,y,d,表示 mxy 的初始位置和一开始跑的方向。
(d = 0 表示东,1 表示南,2 表示西,3 表示北)。
第三行与第二行格式相同,但描述的是对手。
【输出】
t 行,若会遭遇则包含两个整数,表示她们第一次相遇格子的坐标,否则输出“−1”。
【输入输出样例】
fight.in
2
2
0 0 0
0 1 2
4
0 1 0
3 2 0
fight.out
-1
1 3
var
fx:array[0..3]of longint=(0,1,0,-1);
fy:array[0..3]of longint=(1,0,-1,0);
v,vv:array[0..1000,0..1000]of boolean;
t,n,x,y,d,xx,yy,dd,i,j,jj:longint;
b,bb:boolean;
function try(w,p,s:longint):boolean;
begin
if w>3 then w:=0;//向右转
inc(j);//做过一个方向了
if j>4 then exit(false);//走过4个方向了,证明没得走了
p:=p+fx[w];s:=s+fy[w];
if (p<0) or (p>=n) or (s<0) or (s>=n) or (v[p,s]) then try:=try(w+1,x,y)//向右转,所以+1(越边境或被走过就换方向)
else if not(v[p,s]) then begin//如果没被走过
v[p,s]:=true;
d:=w;x:=p;y:=s;
j:=0;
exit(true);
end;
end;
function try2(w,p,s:longint):boolean;
begin
if w<0 then w:=3;//向左转
inc(jj);
if jj>4 then exit(false);
p:=p+fx[w];s:=s+fy[w];
if (p<0) or (p>=n) or (s<0) or (s>=n) or (vv[p,s]) then try2:=try2(w-1,xx,yy)//向右转,所以-1
else if not(vv[p,s]) then begin
vv[p,s]:=true;
dd:=w;xx:=p;yy:=s;
jj:=0;
exit(true);
end;
end;
begin
readln(t);
for i:=1 to t do
begin
fillchar(v,sizeof(v),false);//重置,因为每次处理的数据是不同的
fillchar(vv,sizeof(vv),false);
b:=false;bb:=false;//记号,用来判断mxy和对手是否还能走(四面没被完全堵住)
readln(n);
readln(x,y,d);
v[x,y]:=true;//不会走走过的格子,出生点也算
readln(xx,yy,dd);
vv[xx,yy]:=true;
while (x<>xx)or(y<>yy) do//如果没碰面就一直走
begin
j:=0;jj:=0;
if not(b) then//如果没被堵住
if not(try(d,x,y)) then b:=true;//如果返回false就是被堵住了
if not(bb) then
if not(try2(dd,xx,yy)) then bb:=true;
if (b) and (bb)then break;//如果两个人都被堵住了就不走了
end;
if (x=xx)and(y=yy) then writeln(x,' ',y)
else writeln(-1);
end;
end.
本文介绍了一种在游戏地图中模拟玩家移动并预测遭遇位置的算法。游戏中两名玩家从随机位置出发,在n*n的地图上移动,遵循特定规则,直至相遇。文章提供了完整的伪代码实现。
768

被折叠的 条评论
为什么被折叠?



