hdu 4452 Running Rabbits

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4452


题目大意:

在一张n*n的图中,两只兔子,兔子Tom从(1,1)出发,兔子Jerry从(n,n)出发.

一个clock,Tom可以跳ts步,Jerry可以跳js步,如果跳的时候碰到地图尽头那么就掉头跳.

Tom每跳tt个clock向左转,Jerry每跳jt个clock向左转,如果相遇,两兔互换方向,不左转(如果刚好到要左转的clock事).


题目思路:

纯模拟.


代码:

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <ctype.h>
#include <math.h>
#include <time.h>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;

#define ll __int64
#define ls rt<<1
#define rs ls|1
#define lson l,mid,ls
#define rson mid+1,r,rs
#define middle l+r>>1
typedef pair<int,int> pii;
typedef multiset<int> mset;
typedef multiset<int>::iterator mst_it;

template <class T> T _max(T x,T y){return x>y? x:y;}
template <class T> T _min(T x,T y){return x<y? x:y;}
template <class T> void _swap(T &x,T &y){T z=x;x=y;y=z;}
template <class T> T GCD(T a,T b){for(T t;b;t=a%b,a=b,b=t);return a;}
template <class T> T LCM(T a,T b){return a/GCD(a,b)*b;}
#define clr_all(x,num) memset(x,num,sizeof(x))
#define clr(x,num,sz) memset(x,num,sizeof(x[0])*(sz+1))
#define inf 0x3F3F3F3F
#define eps (1e-9)
#define MOD 1000000007
const double pi=acos(-1.0);
const int M=20 +5;
int ts,cas=0;

int n,m,k;
int dir[4][2]={{-1,0},{0,-1},{1,0},{0,1}};
int lft[4]={1,2,3,0},op[4]={2,3,0,1};
char c[2];
int d[2],s[2],t[2];
struct node{
    int x,y,d,cnt;
}p[2];

void run(){
    int i,j;
    p[0].x=p[0].y=1;
    p[1].x=p[1].y=n;
    for(i=0;i<2;i++){
        scanf("%s%d%d",c,&s[i],&t[i]);
        switch(c[0]){
        case 'N':p[i].d=d[i]=0;break;
        case 'W':p[i].d=d[i]=1;break;
        case 'S':p[i].d=d[i]=2;break;
        case 'E':p[i].d=d[i]=3;break;
        }
        p[i].cnt=0;
    }
    scanf("%d",&k);
    int x,y,ss;
    while(k--){
        for(i=0;i<2;i++){
            p[i].cnt++;
            if(dir[p[i].d][0]){
                x=p[i].x+dir[p[i].d][0]*s[i];
                if(x<1){
                    ss=p[i].x-1;
                    p[i].d=op[p[i].d];
                    p[i].x=1+dir[p[i].d][0]*(s[i]-ss);
                }else if(x>n){
                    ss=n-p[i].x;
                    p[i].d=op[p[i].d];
                    p[i].x=n+dir[p[i].d][0]*(s[i]-ss);
                }else p[i].x=x;
            }else{
                y=p[i].y+dir[p[i].d][1]*s[i];
                if(y<1){
                    ss=p[i].y-1;
                    p[i].d=op[p[i].d];
                    p[i].y=1+dir[p[i].d][1]*(s[i]-ss);
                }else if(y>n){
                    ss=n-p[i].y;
                    p[i].d=op[p[i].d];
                    p[i].y=n+dir[p[i].d][1]*(s[i]-ss);
                }else p[i].y=y;
            }
        }
        if(p[0].x==p[1].x && p[0].y==p[1].y) _swap(p[0].d,p[1].d);
        else for(i=0;i<2;i++) if(p[i].cnt%t[i]==0) p[i].d=lft[p[i].d];
    }
    for(i=0;i<2;i++)
        printf("%d %d\n",p[i].x,p[i].y);
}


void preSof(){
}

int main(){
    //freopen("input.txt","r",stdin);
    //freopen("output.txt","w",stdout);
    preSof();
    //run();
    while(~scanf("%d",&n) && n) run();
    //for(scanf("%d",&ts),cas=1;cas<=ts;cas++) run();
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值