せいしゅん404 • 3年前
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int MAXN=1010;
const int dx[]= {
0,1,0,-1
}
,dy[]= {
1,0,-1,0
}
;
bool v1[MAXN][MAXN],v2[MAXN][MAXN];
void work() {
bool c1=true,c2=true;
int n,x1,y1,d1,x2,y2,d2;
cin>>n>>x1>>y1>>d1>>x2>>y2>>d2;
++x1,++x2,++y1,++y2;
memset(v1,true,sizeof(v1));
memset(v2,true,sizeof(v2));
//初始化格子
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
v1[i][j]=v2[i][j]=false;
//判断初始位置是否在同一个点
if(x1==x2&&y1==y2) {
cout<<x1-1<<" "<<y1-1<<endl;
return;
}
//进入的时候就开始做标记
v1[x1][y1]=v2[x2][y2]=true;
while(c1||c2) {
if(c1) {
//下一步的位置
int tx1=x1+dx[d1],ty1=y1+dy[d1];
//如果下一步不是边缘也没有走过则执行else
if(v1[tx1][ty1]) {
d1=(d1+1)%4;
tx1=x1+dx[d1];
ty1=y1+dy[d1];
if(v1[tx1][ty1]) {
c1=false;
} else {
x1=tx1;
y1=ty1;
}
} else {
x1=tx1;
y1=ty1;
}
}
if(c2) {
//下一步的位置
int tx2=x2+dx[d2],ty2=y2+dy[d2];
//如果下一步不是边缘也没有走过则执行else
if(v2[tx2][ty2]) {
d2=(d2+3)%4;
tx2=x2+dx[d2];
ty2=y2+dy[d2];
if(v2[tx2][ty2]) {
c2=false;
} else {
x2=tx2;
y2=ty2;
}
} else {
x2=tx2;
y2=ty2;
}
}
//走过的点标记为true
v1[x1][y1]=v2[x2][y2]=true;
if(x1==x2&&y1==y2) {
cout<<x1-1<<" "<<y1-1<<endl;
return;
}
}
cout<<-1<<endl;
}
int main(void) {
int t;
cin>>t;
while(t--) work();
return 0;
}
评论:
请先登录,才能进行评论