我看题解里都没有提到曼哈顿距离,其实可以用曼哈顿距离来解决火把照亮问题。
曼哈顿距离就是两点在南北方向上的距离加上在东西方向上的距离,即d(i,j)=|xi-xj|+|yi-yj|。
首先我们观察火把照亮范围的规律。
|暗|暗| 光 |暗|暗|
|暗|光| 光 |光|暗|
|光|光|火把|光|光|
|暗|光| 光 |光|暗|
|暗|暗| 光 |暗|暗|
可以发现两个规律:
- 所有的光都是对称的
- 光到火把的曼哈顿距离都小于2
所以我们只需要在5x5的范围内使用一个if判断就可以解决问题。
if (abs(x - i) + abs(y - j) <= 2) {
arr[i][j] = 1;
}
但是这个方法在时间效率上并不比暴力高,所以只是看起来更优雅一点而已