AC代码

せいしゅん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;
}

评论:

请先登录,才能进行评论