【NOIP2016复赛模拟赛2】遭遇战

问题描述
有一n*n矩阵,左上角为(0,0),右下角为(n-1,n-1),有两个人,给出初始位置及方向,速度相同,两人都不会走自己走过的路,当两人向一个方向前进时会一直走到不能走为止,若不能走,玩家a会右转,玩家b会左转,若完全不能动时则停止,问两人相遇的坐标(不能相遇则输出-1)。
输入
第一行t,表示t组数据(1<=t<=10)
接下来t组数据,每组第一行为n(1<=n<=1000)
第二行x,y,d,表示玩家a的坐标及方向
(d=0表示东,d=1表示南,d=2表示西,d=3表示北)
第三行格式与第二行相同,描述的为玩家b
输出
t行,会相遇则为第一次相遇的坐标,否则为-1.
样例输入
2
2
0 0 0
0 1 2
4
0 1 0
3 2 0
样例输出
-1
1 3
算法讨论
本题没必要也不能用搜索,1000的搜索肯定会炸,一个模拟就可以了(虽然很麻烦),具体怎么模拟看标,注意是多组数据,所以一定要清空所有相关记录的数组及变量,初评没过就是因为没有清空标记数组……

const
  maxn=1005;
  dx:array[0..3] of longint=(0,1,0,-1);
  dy:array[0..3] of longint=(1,0,-1,0);
var
  i,j,n,t,x,y,d,x1,y1,d1,s,s1:longint;
  f,f1:array[0..maxn,0..maxn] of boolean;
  flag:boolean;

procedure rturn;
begin
  inc(d);
  if d>3
    then d:=0;
  if (x+dx[d]>n) or (x+dx[d]<0) or (y+dy[d]>n) or (y+dy[d]<0) or (f[x+dx[d],y+dy[d]])
    then inc(s)
    else begin
           inc(x,dx[d]);
           inc(y,dy[d]);
           f[x,y]:=true
         end;
end;

procedure lturn;
begin
  dec(d1);
  if d1<0
    then d1:=3;
  if (x1+dx[d1]>n) or (x1+dx[d1]<0) or (y1+dy[d1]>n) or (y1+dy[d1]<0) or (f1[x1+dx[d1],y1+dy[d1]])
    then inc(s1)
    else begin
           inc(x1,dx[d1]);
           inc(y1,dy[d1]);
           f1[x1,y1]:=true
         end;
end;

begin
  assign(input,'fight.in'); reset(input);
  assign(output,'fight.out'); rewrite(output);
  read(t);
  for i:=1 to t do
    begin
      fillchar(f,sizeof(f),false);
      fillchar(f1,sizeof(f1),false);
      read(n);
      read(x,y,d);
      read(x1,y1,d1);
      if (x=x1) and (y=y1)
        then begin
               writeln(x,' ',y);
               continue
             end;
      flag:=false;
      f[x,y]:=true;
      f1[x1,y1]:=true;
      n:=n-1;
      s:=0;
      s1:=0;
      for j:=1 to n*n do
        begin
          if ((x+dx[d]>n) or (x+dx[d]<0) or (y+dy[d]>n) or (y+dy[d]<0) or (f[x+dx[d],y+dy[d]])) and (s<4)
            then rturn
            else if s<4
                   then begin
                          inc(x,dx[d]);
                          inc(y,dy[d]);
                          f[x,y]:=true;
                          s:=0
                        end;
          if ((x1+dx[d1]>n) or (x1+dx[d1]<0) or (y1+dy[d1]>n) or (y1+dy[d1]<0) or (f1[x1+dx[d1],y1+dy[d1]])) and (s1<4)
            then lturn
            else if s1<4
                   then begin
                          inc(x1,dx[d1]);
                          inc(y1,dy[d1]);
                          f1[x1,y1]:=true;
                          s1:=0
                        end;
          if (x=x1) and (y=y1)
            then begin
                   writeln(x,' ',y);
                   flag:=true;
                   break
                 end
        end;
      if not(flag)
        then writeln(-1)
    end;
  close(input); close(output)
end.

【NOIP2016复赛模拟赛2】遭遇战_第1张图片
Pixiv ID:60541651

你可能感兴趣的:(模拟)