阿里技术沙龙讨论题

原题大意:

有一栋楼,楼里有很多房间,每个房间有一盏灯和一个开关,这个开关可以控制这盏灯,此外每个房间还有两个不同颜色的LED灯

有一个遥控器,遥控器上有两个按钮,每个按钮分别控制所有房间的一个LED灯。

类似于俄罗斯方块,将每个房间灯亮时,看作一个方块,请你设计一个方法使用遥控器控制一个方块的下落过程。

除智能通信设备以外,工具任选,方块的下落与否仅仅与时间相关,每个房间由一个人来控制灯的开与关,楼下有一个人来使用遥控器控制

分析:

这个题目咋一看确实比较复杂,无从下手,但是我们可以看看两个视频: 
宿舍楼玩贪吃蛇: http://v.youku.com/v_show/id_XMzg0MTUwMTI=.html

宿舍楼玩俄罗斯方块:http://v.youku.com/v_show/id_XMTAyMjk4Mjg0.html

这里给出的技术方案不能太复杂,必须是简单,每个房间的人都能听得懂做得到的。

对于这个题目可以这样分析:由于方块下落与否仅仅与时间相关,那么假设每秒方块下落一次,这样就可以使用一个时钟(秒表)来记录当前方块在第几层,所以需要给每个房间配置一个时钟。 
由于每次只能有一个房间的灯亮,这样,如果使用遥控器控制下一个灯亮,上一次亮的灯就必须变暗,所以可以将楼栋放在一个座标系中,然后给每个房间对应一个座标系中的横坐标和纵坐标。 
由于设计的方案必须简单可行,每个房间的人都应该能够听懂,所以设置的变量就不能太多。

根据上面的分析,设计如下:将楼栋的左上角房间设置为平面座标系的原点(O),每个房间的宽度和长度都为1,那么顶层房间的坐标从左到右分别是(0,0),(0,1),(0,2)等,倒数第二层房间的坐标从左到右分别是(1,0),(1,1),(1,2)等…. 
对于一个高3层,每层有4个房间的楼栋来说,它每个房间的坐标如下图所示:


假设开始时,坐标为(0,0)的房间亮灯,设置一个全局的变量m来记录当前开关所处的横坐标,假设LED灯在每个房间分为左右两个,那么左边的LED灯亮一次m减去1,当为0时,继续亮左边的LED灯,m值不变,右边的LED灯亮一次m加上1,当m为楼栋的宽度减去1时(即横坐标的最大值),继续亮右边的LED灯,m值不变,所有房间的人都记录这个m值。

每秒方块下落一层,所以在第0秒开始到第1秒之间,房间号纵坐标为0的房间中的人处于紧张状态,当m值与自己的横坐标相同时,亮灯,否则关灯。对于楼栋中每个房间的人来说,当时钟的秒值与自己的纵坐标相同,m值与自己的横坐标相同时,灯亮,否则灯关。

这样楼下的人就可以通过遥控器简单的来控制一个方块的下落过程。

与出题者交流了一番,出题者本意并不是要求使用程序实现,而是考察大家做方案的能力,目的是让大家把计算机世界的逻辑,延伸到现实世界。确实,从现实世界到计算机世界需要抽象,这部分做得好,这是一种能力,反过来,如果计算机世界逻辑应用到现实世界,那么在现实世界中的事情也会变得容易,这也许就是万事万物都是想通的这个说法吧!


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值