HDU4452 Running Rabbits(模拟)

题目链接

题意

  1. 一个NxN的方阵。
  2. 一个机器人从左下角出发,另一个机器人从右下角出发。
  3. 机器人在撞墙的时候会掉头(turn around),在固定的时间会左转
  4. 如果两个机器人想遇,则两个机器人互换方向(只会在整数小时时相遇),且忽略此时的左转

解决

模拟,使用一个类来封装一些函数,会好写好多

#include<bits/stdc++.h>
using namespace std;

int N;

struct TOM
{
    int x,y;
    int speed;
    int dir;            //n->1 s->2 w->3 e->4
    TOM(int s = 0 , int d = 0){
        x = 1;
        y = 1;
        speed = s;
        dir = d;
    }
    void turnleft()
    {
        if(dir==1)  dir=3;
        else if(dir==2) dir=4;
        else if(dir==3) dir=2;
        else if(dir==4) dir=1;
    }

    void go()
    {
        int tmp = speed;
        while(tmp--)
        {
            if(dir==1){
                if(x==1){
                    tmp++;
                    dir = 2;
                    continue;
                }
                x--;
            }
            else if(dir==2){
                if(x==N){
                    tmp++;
                    dir = 1;
                    continue;
                }
                x++;
            }
            else if(dir==3){
                if(y==1){
                    tmp++;
                    dir = 4;
                    continue;
                }
                y--;
            }
            else if(dir==4){
                if(y==N){
                    tmp++;
                    dir = 3;
                    continue;
                }
                y++;
            }
        }
    }
};

struct JARRY
{
    int x,y;
    int speed;
    int dir;            //n->1 s->2 w->3 e->4
    JARRY(int s = 0 , int d = 0){
        x = N;
        y = N;
        speed = s;
        dir = d;
    }
    void turnleft()
    {
        if(dir==1)  dir=3;
        else if(dir==2) dir=4;
        else if(dir==3) dir=2;
        else if(dir==4) dir=1;
    }

    void go()
    {
        int tmp = speed;
        while(tmp--)
        {
            if(dir==1){
                if(x==1){
                    tmp++;
                    dir = 2;
                    continue;
                }
                x--;
            }
            else if(dir==2){
                if(x==N){
                    tmp++;
                    dir = 1;
                    continue;
                }
                x++;
            }
            else if(dir==3){
                if(y==1){
                    tmp++;
                    dir = 4;
                    continue;
                }
                y--;
            }
            else if(dir==4){
                if(y==N){
                    tmp++;
                    dir = 3;
                    continue;
                }
                y++;
            }
        }
    }
};

int main()
{
    while(~scanf("%d",&N))
    {
        if(!N)  break;
        char str[5];
        int s1,s2,t1,t2,dir;
        scanf("%s%d%d",str,&s1,&t1);
        if(str[0]=='N') dir = 1;
        if(str[0]=='S') dir = 2;
        if(str[0]=='W') dir = 3;
        if(str[0]=='E') dir = 4;
        TOM tom(s1,dir);
        scanf("%s%d%d",str,&s2,&t2);
        if(str[0]=='N') dir = 1;
        if(str[0]=='S') dir = 2;
        if(str[0]=='W') dir = 3;
        if(str[0]=='E') dir = 4;
        JARRY jarry(s2,dir);

        int k;
        scanf("%d",&k);

        for(int i=1;i<=k;i++){
            tom.go();
            jarry.go();

            if(tom.x==jarry.x&&tom.y==jarry.y){
                swap(tom.dir,jarry.dir);
                continue;
            }

            if(i%t1==0) tom.turnleft();
            if(i%t2==0) jarry.turnleft();
        }

        printf("%d %d\n",tom.x,tom.y);
        printf("%d %d\n",jarry.x,jarry.y);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值