题目大意:
mxy游戏中在N*N大小的矩阵中与敌人战斗,他的坐标以及一开始走的方向为[x,y,d],敌人则是[p,q,z],
他们各自不能走自己已经走过的路,不能走时mxy右转,敌人不能走时左转,如果都不行就停止不动。
游戏有T场,每一场输出他们相遇的位置,如果都停止了,并且没有相遇则输出-1。
d=0 东 / d=1 南 / d=2 西 / d=3 北
p同b
1≤T≤100
1≤N≤1000
题解:
纯模拟:
照着题意打就好了
不过注意!!!假如作为mxy,你要向右转了,这时候你的方向是北,就是向东转,可是你向东转以后,你的方向就是向东了,一直到下一次转弯,而迷茫的我以为…
向东转一步,然后继续向北走,就这样没了100。。。
时间复杂度:O(N^2*T)
const
dx:array [0..3] of longint=(0,1,0,-1);
dy:array [0..3] of longint=(1,0,-1,0);
var
a,b:Array [0..1001,0..1001] of boolean;
i,j,k,l,n,x,y,xy,p,q,pq:longint;
n1,n2:boolean;
function check1():boolean;
var
aa,bb,fp:longint;
begin
aa:=x+dx[xy]; bb:=y+dy[xy];
fp:=xy;
if a[aa,bb]
then begin fp:=(fp+1) mod 4;
aa:=x+dx[fp];
bb:=y+dy[fp];
end
else begin x:=aa; y:=bb; exit(false); end;
if a[aa,bb]
then exit(true)
else begin x:=aa; y:=bb; xy:=fp; exit(false); end;
end;
function check2():boolean;
var
cc,dd,fq:longint;
begin
cc:=p+dx[pq]; dd:=q+dy[pq];
fq:=pq;
if b[cc,dd]
then begin fq:=fq-1;
if fq=-1 then fq:=3;
cc:=p+dx[fq];
dd:=q+dy[fq];
end
else begin p:=cc; q:=dd; exit(false); end;
if b[cc,dd]
then exit(true)
else begin p:=cc; q:=dd; pq:=fq; exit(false); end;
end;
begin
assign(input,'fight.in'); reset(input);
assign(output,'fight.out');rewrite(output);
readln(k);
for l:=1 to k do
begin
readln(n);
readln(x,y,xy);
readln(p,q,pq);
x:=x+1; y:=y+1; p:=p+1; q:=q+1;
n1:=false;
n2:=false;
for i:=0 to n+1 do
for j:=0 to n+1 do
if (i=0) or (j=0) or (i=n+1) or (j=n+1)
then begin
a[i,j]:=true;
b[i,j]:=true;
end
else begin
a[i,j]:=false;
b[i,j]:=false;
end;
repeat
if (x=p) and (y=q) then break;
a[x,y]:=true;
b[p,q]:=true;
if n1=false then
if check1() then n1:=true;
if n2=false then
if check2() then n2:=true;
until (n1) and (n2);
if (x=p) and (y=q)
then writeln(x-1,' ',y-1)
else writeln('-1');
end;
close(input); close(output);
end.