题四 遭遇战
(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.