hdu 4740 The Donkey of Gui Zhou

题意:已知两个起始点和方向,结果求其相遇的点的坐标,第一个点如果按初始方向走走不下去了就往右走,第二个则相反,还有个要求就是同一个人走过的点不能走。

分析:明显可以直接进行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
*/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值