问题描述
为了测试小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 */