advent to code 第六天 Part Two
前言 继续来闯关,第二小问还卡了我挺长时间,少了一个小判断。。。 题目 ....#..... ....+---+# ....|...|. ..#.|...|. ....|..#|. ....|...|. .#.O^---+. ........#. #......... ......#... 这一问是要在地图上放置障碍物,使得守卫进入循环,避免发现我们,比如下面在(6,3)处放置一个障碍物,就会导致守卫循环得走一条路,需要我们找出有多少个位置放上障碍物会导致守卫进入循环。 思路 以前还真没有做过如何判断矩阵中循环路径,一开始没什么思路,后面想到,守卫走过的步数是小于整个矩阵的大小的,如果守卫走的步数巨大,那不就说明守卫进入了循环吗? 根据这个思路我们很快就可以改好第一版代码 解法 我们只需在 while循环中加一个变量来记录守卫走过的步数,当超过一定的数值就退出循环,我这里设置的是矩阵大小的 10 倍。 function checked(matrix, oi, oj) { const rows = matrix.length; const cols = matrix[0].length; let i = oi; let j = oj; let pos = 'up'; let step = 0; while (i < rows && i >= 0 && j < cols && j >= 0) { step++; if (step > cols * rows * 10) { return 1; } if (pos === 'up') { if (matrix[i - 1] && matrix[i - 1][j] === '#') { j++; pos = transformPosMap[pos]; } else { i--; } } else if (pos === 'right') { if (matrix[i][j + 1] === '#') { i++; pos = transformPosMap[pos]; } else { j++; } } else if (pos === 'down') { if (matrix[i + 1] && matrix[i + 1][j] === '#') { j--; pos = transformPosMap[pos]; } else { i++; } } else if (pos === 'left') { if (matrix[i][j - 1] === '#') { i--; pos = transformPosMap[pos]; } else { j--; } } } return 0; } 其实我们只需要在守卫走过的路径上放障碍物,可以节省一些判断,因为在守卫没走过的地方放障碍物不会影响到守卫的路径。...