题意
有一个n*m的网格,有一个机器人初始在(x,y),面朝某个斜45°的方向。机器人会一直走,遇到墙就按弹性碰撞规则(就像台球碰到桌子边缘一样)反弹。机器人每走一格,就会将其所在格子染黑。问机器人走几格之后会将整张网格染成黑白相间(或判断这种情况永远不会发生)。
分析
首先有一个结论:边缘上所有该染黑的格子都已染黑,当且仅当整张网格已按要求染成黑白相间。
证法是归纳。假设第一行该染黑的格子都已染黑,那就会发现第二行该染黑的格子都已染黑。因为第一行某个染黑格必定一进一出,即其左下和右下的两格都染黑了。当然也要考虑角上的情况,还有第一行该染黑的最后一个格子只进不出的情况(这时由于它两旁相间的格子都已染黑,所以左下和右下的两格必定也染黑)。故用数学归纳法可证。
那么问题就很简单了:开一个map,储存所有已访问过的边缘格子。然后模拟机器人的行走。将机器人的速度分解成水平和竖直两个分量,这个想法是很优美的。
对n,m的奇偶性讨论之后会发现,边缘上该染黑的格子永远有n+m-2个。
代码
#include#include #include #include #include #include