题意:已知两个起始点和方向,结果求其相遇的点的坐标,第一个点如果按初始方向走走不下去了就往右走,第二个则相反,还有个要求就是同一个人走过的点不能走。
分析:明显可以直接进行BFS,很简单,细节过程注意就行。直接附代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<stack>
#include<algorithm>
using namespace std;
const int maxn = 1005;
struct Node{
int x,y,direct;
Node(int a=0,int b=0,int dd=0){
x=a;
y=b;
direct=dd;
}
};
int dir[4][2]={0,1,1,0,0,-1,-1,0};
Node ans;
int mark1[maxn][maxn],mark2[maxn][maxn];
int n;
bool bfs(int sx,int sy,int dirs,int ex,int ey,int dire){
queue<Node>q1;
queue<Node>q2;
q1.push(Node(sx,sy,dirs));
q2.push(Node(ex,ey,dire));
int flagx1=-1,flagy1=-1;//代表第一个点是否已经停下
int flagx2=-1,flagy2=-1;//代表第二个点是否已经停下
mark1[sx][sy]=1;//标记第一个人走过的
mark2[ex][ey]=1;//标记第二个人走过的
while((!q1.empty()) || (!q2.empty())){
Node on1,on2;
if(flagx1==-1){
on1=q1.front();
q1.pop();
}
if(flagx2==-1){
on2=q2.front();
q2.pop();
}
int x1=on1.x;
int y1=on1.y;
int x2=on2.x;
int y2=on2.y;
//接下来是判断是否第一个人和第二个人是否相交与同一个点
if(flagx1!=-1 && flagx2!=-1){
if(flagx1==flagx2 && flagy1==flagy2) {
ans=on1;
return true;
}
else{
return false;
}
}
else if(flagx1!=-1){
if(flagx1==x2 && flagy1==y2) {
ans=on2;
return true;
}
}
else if(flagx2!=-1){
if(flagx2==x1 && flagy2==y1) {
ans=on1;
return true;
}
}
else{
if(x2==x1 && y2==y1) {
ans=on1;
return true;
}
}
int xx1=x1+dir[on1.direct][0],yy1=y1+dir[on1.direct][1];
int xx2=x2+dir[on2.direct][0],yy2=y2+dir[on2.direct][1];
if(flagx1==-1){
if(xx1>=n || xx1 <0 || yy1<0 || yy1>=n || mark1[xx1][yy1]){
on1.direct=(on1.direct+1)%4;
xx1=x1+dir[on1.direct][0],yy1=y1+dir[on1.direct][1];
}
// printf("zhuan-----%d %d\n",xx1,yy1);
if(xx1>=0 && xx1<n && yy1>=0 && yy1<n && !mark1[xx1][yy1] ){
mark1[xx1][yy1]=1;
// printf("x1~~~~~\n");
//if(flagx1==-1)
q1.push(Node(xx1,yy1,on1.direct));
}
else{
flagx1=x1;
flagy1=y1;
}
}
if(flagx2==-1){
if(xx2>=n || xx2 <0 || yy2<0 || yy2>=n || mark2[xx2][yy2]){
on2.direct=(on2.direct-1+4)%4;
xx2=x2+dir[on2.direct][0],yy2=y2+dir[on2.direct][1];
}
// printf("zhuan----%d %d\n",xx2,yy2);
if( xx2>=0 && xx2<n && yy2>=0 && yy2<n && !mark2[xx2][yy2]){
mark2[xx2][yy2]=1;
//printf("xx2~~%d %d~~~~~\n",xx2,yy2);
//if(flagx2==-1)
q2.push(Node(xx2,yy2,on2.direct));
}
else{
flagx2=x2;
flagy2=y2;
}
}
//printf("%d %d--flag--%d %d\n",flagx1,flagy1,flagy2,flagy2);
}
return false;
}
int main(){
while(~scanf("%d",&n) && n){
int sx,sy,dirs;
int ex,ey,dire;
scanf("%d %d %d",&sx,&sy,&dirs);
// sx=3-sx;
scanf("%d %d %d",&ex,&ey,&dire);
//ex=3-ex;
memset(mark1,0,sizeof(mark1));
memset(mark2,0,sizeof(mark2));
if(bfs(sx,sy,dirs,ex,ey,dire)){
printf("%d %d\n",ans.x,ans.y);
}
else{
printf("-1\n");
}
}
}
/*
4
3 3 0
3 0 0
4
3 0 0
2 0 0
*/