牛客网寒假集训5 炫酷镜子

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


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

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

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

输入描述:

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

1≤N,M≤5001≤N,M≤500

输出描述

输出M行整数,依次为从第i个格子从上往下射入时从下面的哪里射出,如果光线不会从下面射出,则输出-1。
示例1

输入

3 3
...
...

\.\

输出

3
2
-1

说明

第一列遇到镜子两次反弹通过第三列射出。

第二列直接射出。

第三列因为镜子反弹后向右边射出。

思路

查找出一条能满足从下射出的路径,如果没有就返回-1,用s表示光线的状态,最开始光线向下为1。

#include
#include
using namespace std;
const int MAXN=510;
int n,m;
int dir[5][2]={0,0,0,1,0,-1,1,0,-1,0}; //1下 2上 3右 4左 
char map[MAXN][MAXN];
struct node{
	int x,y,s;
};
int bfs(int x,int y,int s){
	queueq;
	q.push({x,y,s});
	while(!q.empty()){
		x=q.front().x,y=q.front().y,s=q.front().s;
		q.pop();
		if(x<1||x>m||y<1||y>n)continue;	
		else if(map[x][y]=='\\'){
			if(s==1)s=3;
			else if(s==2)s=4;
			else if(s==3)s=1;
			else s=2;
		}
		else if(map[x][y]=='/'){
			if(s==1)s=4;
			else if(s==2)s=3;
			else if(s==3)s=2;
			else s=1;
		}
		int xx=x+dir[s][0],yy=y+dir[s][1];
		if(xx>=1&&xx<=m&&y>=1&&y<=n)
		q.push({xx,yy,s});
		if(s==1&&y==n)return x;
	}
	return -1;
}
int main(){
	   cin>>n>>m;
	    for(int i=1;i<=n;i++)
	     for(int j=1;j<=m;j++)
	     cin>>map[j][i];
	     for(int i=1;i<=m;i++)
	     cout<

 

 

 

 

 

 

 

你可能感兴趣的:(牛客)