小W学物理

问题描述

为了测试小W的物理水平,Mr.X在二维坐标系中放了N面镜子(镜子坐标绝对值不超过M),镜子均与坐标轴成45°角,所以一共有两种类型“/”和“\”。原点不会有镜子,任意一点最多只有一面镜子。
    镜子两个面都能反光,而中间不透光,例如,对于一个“/”型镜子,下方向射入的光线会被反射到右方向,左方向射入的光线会被反射到上方向。
    现在有一条光线从原点沿X轴正方向射出,求走过T路程后所在位置。

输入

第一行三个整数N,M,T。
    第2到N+1行,每行两个整数Xi,Yi,表示镜子坐标,一个字符Si表示镜子类型

数据保证镜子的位置不会重复

输出

    一行两个整数,表示走过T路程后的坐标。

样例 

mir.in

5 2 8
0 1 \
0 2 /
1 0 /
1 1 \
1 2 \

 

mir.out

3 1

 

数据范围

对于不同的测试点,我们约定各种参数的规模不会超过如下

测试点标号

N

M

T

1

1

1000

1000000

2

100000

3

4

1000

5

6

10^18

7

8

1

10^9

9

1000

10

11

100000

1000

12

13

14

1000000

15

16

17

10^9

10^18

18

19

20

 


思路: 

30暴力,注意:将原点移至(1000,1000)

code

#include<stdio.h>
#include<algorithm> 
using namespace std;
const int mxn=100010,M=1000;
bool vis[1010][1010];
int n,m,T,mp[2010][2010],tur[5][5];
int dx[]={0,0,0,-1,1};
int dy[]={0,1,-1,0,0};

void biao() {
    tur[1][1]=4,tur[1][2]=3;
    tur[2][1]=3,tur[2][2]=4;
    tur[3][1]=2,tur[3][2]=1;
    tur[4][1]=1,tur[4][2]=2;
}
void file() {
    freopen("mir.in","r",stdin);
    freopen("mir.out","w",stdout);
}
int main() 
{
//    file();
    scanf("%d%d%d",&n,&m,&T);
    for(int i=1;i<=n;++i) {
        int x,y;
        char cas[2];
        scanf("%d%d%s",&x,&y,cas);
        if(cas[0]=='/') mp[x+M][y+M]=1;
        else mp[x+M][y+M]=2;
    }
    biao();
    int x=0,y=0,k=4;
    while(T--) {
        x+=dx[k],y+=dy[k];
        if(mp[x+M][y+M]==1) k=tur[k][1];
        else if(mp[x+M][y+M]==2) k=tur[k][2];
    }
    printf("%d %d",x,y);
    return 0;
}
/*
5 2 8
0 1 \
0 2 /
1 0 /
1 1 \
1 2 \
*/

 

posted @ 2018-10-30 17:28  qseer  阅读(204)  评论(0编辑  收藏  举报