5I.炫酷镜子(C++)

阅读: 评论:0

5I.炫酷镜子(C++)

5I.炫酷镜子(C++)

炫酷镜子(C++)

点击做题网站链接

题目描述
小希拿到了一个镜子块,镜子块可以视为一个N x M的方格图,里面每个格子仅可能安装或者/的镜子,会反射90°光线,也可能没有安装镜子,使用.代替。
但她看不清楚里面的镜子构造是怎样的。
你是这块镜子块的主人,所以你想计算这块镜子块(从输入的上方往下射入光线)从左到右每一格射入依次分别会从最下面的哪一格子射出,如果无法射出,输出-1。

输入描述:
第一行输入两个整数N,M。随后的N行,每行M个字符。
1≤N,M≤500

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

示例1
输入

3 3

...
...
.

输出
3
2
-1

说明
第一列遇到镜子两次反弹通过第三列射出。
第二列直接射出。
第三列因为镜子反弹后向右边射出。

题目思路:

一道非常有意思的题目,让我想到了一些手机小游戏的设计。
直接模拟即可,或者使用并查集或者记忆化搜索也可。
时间复杂度O(NM)

解题代码:

#include <iostream>
using namespace std;
int main()
{int n,m;char a[505][505];int dx[4][2]={-1,0,//第一列是对应于x(纵向坐标变化)1,0,//第二列是对应于y(横向坐标变化)0,-1,0,1};int change[2][4]={3,2,1,0,//这是一个协助dir改变方向的数组2,3,0,1};//第一行是如果碰到'/'镜子,第二行是如果碰到''镜子cin >> n >> m;for(int i=1;i<=n;++i)for(int j=1;j<=m;++j)cin >> a[i][j];for(int i=1;i<=m;++i){int x=0,y=i,dir=1;//dir:1下,2左,3右,4上while(1){x += dx[dir][0];//纵向的行进y += dx[dir][1];//横向的行进if( x>n ) break;//如果纵向超过下边界else if( x<1 || y<1 || y>m )//如果纵向超过上边界,或横向超过左边界,或横向超过右边界{y=-1;//光线不会从下面射出break;}else//在范围内{if( a[x][y]=='/' )//如果碰到'/'镜子dir = change[0][dir];//改变方向,变为向左或向下else if( a[x][y]=='\' )//如果碰到''镜子dir = change[1][dir];//改变方向,变为向右或向上}}cout << y << endl;}
}

转载于:.html

本文发布于:2024-02-01 17:27:55,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170678084538274.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:镜子
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23