问题描述
有一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.