【问题描述】
小林和小华在一个 n×n的矩形方格里玩游戏,矩形左上角为(0,0),右下角为(n−1,n−1)。
两人同时进入地图的随机位置,并以相同速度进行走位。为了隐蔽性,两人都不会再走自己走过的格子。如果两人向某一方向前进,那么他们会跑到不能跑为止,当不能跑的时候,小林会向右转,小华则会向左转,如果不能跑,则不再动。现在已知两人进入地图的初始位置和方向,请算出两人遭遇的位置。
【输入格式】
第 1 行 1 个正整数 t,表示测试数据组数,1≤t≤10。
接下来的 t 组数据,每组数据的第1行包含 1 个整数n,1≤n≤1000。
第 2 行包含 3 个整数x、y和d,表示小林的初始位置和一开始跑的方向。其中,d=0 表示东; d=1 表示南;d=2 表示西;d=3 表示北。
第 3 行与第 2 行格式相同,但描述的是小华。
【输出格式】
输出 t 行,若会遭遇,则包含两个整数,表示他们第一次相遇格子的坐标,否则输出“-1”。
【输入样例】
2
2
0 0 0
0 1 2
4
0 1 0
3 2 0
【输出样例】
-1
1 3
code<代码>
#include<bits/stdc++.h>
#define maxn 1005
using namespace std;
int v1[maxn][maxn],v2[maxn][maxn];
int d[4][2]={
{
0,1},{
1,0},{
0,-1},{
-1,0}};//东 南 西 北 每个方向做的事情 提前准备好
int main()
{
int t,n,xl,yl,dl,xh,yh,dh,u,v,fl=0,fh=0,i;
cin>>t;
while (t--) {
//多组数据 每组开始前,一切归零
cin>>n;
cin>>xl>>yl>>dl;
cin>>xh>>yh>>dh;
if(xl==xh && yl==yh)
{
cout<<xh<<" "<<yh<<endl;
continue;
}
memset(v1,0,sizeof(v1));//数组清零
memset(v2,0,sizeof(v2));
fl=0;fh=0;
v1[xl][yl]=1;
v2[xh][yh]=1;
while(1)
{
if(fl==0)
{
for(i=1;i<=4;i++)
{
u=xl+d[dl][0];
v=yl+d[dl][1];
if(u>=0 && u<=n-1 && v>=0 && v<=n-1 && v1[u][v]==0)//不越界 点没走过
{
xl=u;
yl=v;
v1[u][v]=1;
break;
}
else//越界 走过 不能走
dl=(dl+1)%4;
}
if(i>4) fl=1;
}
if(fh==0)
{
for(i=1;i<=4;i++)
{
u=xh+d[dh][0];
v=yh+d[dh][1];
if(u>=0 && u<=n-1 && v>=0 && v<=n-1 && v2[u][v]==0)//不越界 点没走过
{
xh=u;
yh=v;
v2[u][v]=1;
break;
}
else//越界 走过 不能走
{
dh=(dh-1);
if(dh<0)dh=3;
}
}
if(i>4) fh=1;
}
if(xl==xh && yl==yh)
{
cout<<xh<<" "<<yh<<endl;
break;
}
else
{
if(fl==1 && fh==1)
{
cout<<-1<<endl;
break;
}
}
}