炫酷镜子——(模拟)
链接:https://ac.nowcoder.com/acm/contest/331/I
来源:牛客网
题目描述
小希拿到了一个镜子块,镜子块可以视为一个N x M的方格图,里面每个格子仅可能安装`\`或者`/`的镜子,会反射90°光线,也可能没有安装镜子,使用`.`代替。
但她看不清楚里面的镜子构造是怎样的。
你是这块镜子块的主人,所以你想计算这块镜子块(从输入的上方往下射入光线)从左到右每一格射入依次分别会从最下面的哪一格子射出,如果无法射出,输出-1。
但她看不清楚里面的镜子构造是怎样的。
你是这块镜子块的主人,所以你想计算这块镜子块(从输入的上方往下射入光线)从左到右每一格射入依次分别会从最下面的哪一格子射出,如果无法射出,输出-1。
输入描述:
第一行输入两个整数N,M。随后的N行,每行M个字符。
1≤N,M≤5001≤N,M≤500
输出描述:
输出M行整数,依次为从第i个格子从上往下射入时从下面的哪里射出,如果光线不会从下面射出,则输出-1。
示例1
输入
3 3 ... ... \.\
输出
3 2 -1
说明
第一列遇到镜子两次反弹通过第三列射出。
第二列直接射出。
第三列因为镜子反弹后向右边射出。
#include<stdio.h> #include<iostream> #include<algorithm> #include<cstring> #include<math.h> #include<string> #include<queue> #define ll long long #define inf 0x3f3f3f3f using namespace std; char a[505][505]; int n,m; int d[4][2]={ {-1,0},{1,0},{0,-1},{0,1} }; ///遇到'\',上变左,下变右,左变上,右变下 ///遇到'/',上变右,下变左,左变下,右变上 int line; struct node { int x;int y; int sta;///当前状态上下左右分别是0 1 2 3对应方向下标 }; void to(node now) { while(true) { if(now.x==n) { line=now.y+1; return; } if(now.y==-1 || now.y==m || now.x==-1 ) return; if( a[now.x][now.y]=='.' )///没有镜子直接按状态方向走 { now.x=now.x+d[now.sta][0]; now.y=now.y+d[now.sta][1]; } else if( a[now.x][now.y]=='/' ) { if(now.sta==0) now.sta=3; else if(now.sta==1) now.sta=2; else if(now.sta==2) now.sta=1; else now.sta=0; now.x=now.x+d[now.sta][0]; now.y=now.y+d[now.sta][1]; } else { if(now.sta==0) now.sta=2; else if(now.sta==1) now.sta=3; else if(now.sta==2) now.sta=0; else now.sta=1; now.x=now.x+d[now.sta][0]; now.y=now.y+d[now.sta][1]; } } } int main() { while(scanf("%d%d",&n,&m)!=EOF) { for(int i=0;i<n;i++) scanf("%s",a[i]); for(int i=0;i<m;i++) { node s={0,i,1};///从下面射出 line=-1; to(s); printf("%d\n",line); } } return 0; }