HDU 4740——The Donkey of Gui Zhou

9 篇文章 0 订阅

题意:驴跟老虎一起走,问什么时候能相遇
题目的意思是在一个地方只能转一次弯。。坑了好长时间
代码如下:

#include <cstring>
#include <stdio.h>
#include <algorithm>
#include <iostream>
#include <cmath>
#include <map>
#include <string>
#include <queue>
#include <bitset>
using namespace std;

const int dir[4][2]={0,1,1,0,0,-1,-1,0};

int n;

bool judge(int x,int y)
{
    if(x<0||x>=n)return false;
    if(y<0||y>=n)return false;
    return true;
}
struct Pos
{
    int x,y;
};
Pos don;
int dd;
Pos tir;
int td;
bool visd[1005][1005];
bool vist[1005][1005];

bool solve()
{
    memset(visd,0,sizeof(visd));
    memset(vist,0,sizeof(vist));
    visd[don.x][don.y]=1;
    vist[tir.x][tir.y]=1;
    bool cantir=1;
    bool candon=1;
    while(cantir||candon){
//            cout<<don.x<<' '<<don.y<<' '<<tir.x<<' '<<tir.y<<endl;
        if(don.x==tir.x&&don.y==tir.y){ printf("%d %d\n",don.x,don.y);return true;}

        if(candon){
            Pos to;
            to.x=don.x+dir[dd][0];
            to.y=don.y+dir[dd][1];
            if(judge(to.x,to.y)&&!visd[to.x][to.y]){
                don.x=to.x;don.y=to.y;
                visd[don.x][don.y]=1;
            } else {
                    dd=(dd+1)%4;
                    to.x=don.x+dir[dd][0];
                    to.y=don.y+dir[dd][1];
                    if(judge(to.x,to.y)&&!visd[to.x][to.y]){
                        don.x=to.x;don.y=to.y;
                        visd[don.x][don.y]=1;
                    } else {
                        candon=0;
                    }
//                    if(pre==dd){candon=0;break;}
            }
        }

        if(cantir){
            Pos to;
            to.x=tir.x+dir[td][0];
            to.y=tir.y+dir[td][1];
            if(judge(to.x,to.y)&&!vist[to.x][to.y]){
                tir.x=to.x;tir.y=to.y;
                vist[tir.x][tir.y]=1;
            } else {
                    td=td-1;
                    if(td == -1)td=3;
                    to.x=tir.x+dir[td][0];
                    to.y=tir.y+dir[td][1];
                    if(judge(to.x,to.y)&&!vist[to.x][to.y]){
                        tir.x=to.x;tir.y=to.y;
                        vist[tir.x][tir.y]=1;
                    } else cantir=0;
//                if(pre==td){cantir=0;break;}
            }
        }
        if(don.x==tir.x&&don.y==tir.y){ printf("%d %d\n",don.x,don.y);return true;}
    }
    return false;
}

int main()
{
//    freopen("data.txt","r",stdin);
    while(scanf("%d",&n)!=EOF&&n){
        scanf("%d%d%d",&don.x,&don.y,&dd);
        scanf("%d%d%d",&tir.x,&tir.y,&td);
        if(!solve()){
            puts("-1");
        }
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值