2017.5.21测试 题四 遭遇战

题四  遭遇战

(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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值