炫酷镜子-模拟

链接:https://ac.nowcoder.com/acm/contest/331/I
来源:牛客网

题目描述

小希拿到了一个镜子块,镜子块可以视为一个N x M的方格图,里面每个格子仅可能安装`\`或者`/`的镜子,会反射90°光线,也可能没有安装镜子,使用`.`代替。

但她看不清楚里面的镜子构造是怎样的。

你是这块镜子块的主人,所以你想计算这块镜子块(从输入的上方往下射入光线)从左到右每一格射入依次分别会从最下面的哪一格子射出,如果无法射出,输出-1。

输入描述:

第一行输入两个整数N,M。随后的N行,每行M个字符。

1N,M5001≤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;
}

猜你喜欢

转载自www.cnblogs.com/shoulinniao/p/10351296.html