Advent of Code 2022 Day8 Part1代码问题:样例正确实际输入不符
Advent of Code 2022 第8天问题及代码排查
问题描述
探险队遇到一片整齐种植成网格的高大树林。精灵们解释说这是之前的探险队为重新造林种下的。现在他们好奇这里是否适合建造树屋。
首先要判断这里是否有足够的树木遮挡来隐藏树屋。为此,你需要统计从网格外沿行或列直视时可见的树木数量。
精灵们已经用无人机生成了一张记录每棵树高度的地图(即你的谜题输入)。例如:
30373 25512 65332 33549 35390每棵树用一个数字表示高度,0最矮,9最高。
一棵树木可见的条件是:它与网格边缘之间的所有其他树木都比它矮。仅考虑同一行或列的树木,即只能从任意树木的上、下、左、右方向查看。
网格边缘的所有树木都是可见的——因为它们本身就在边缘,没有树木遮挡视线。在这个例子中,只剩下内部9棵树需要考虑:
- 左上角的5从左和上方可见(从右或下方不可见,因为有其他高度为5的树木阻挡)。
- 上方中间的5从上方和右方可见。
- 右上角的1从任何方向都不可见;要可见的话,它与边缘之间只能有高度为0的树木。
- 左侧中间的5仅从右方可见。
- 中心的3从任何方向都不可见;要可见的话,它与边缘之间只能有高度至多为2的树木。
- 右侧中间的3从右方可见。
- 底部行的中间5可见,但3和4不可见。
边缘有16棵可见树木,内部还有5棵,总共21棵可见树木。
查看你的地图,统计从网格外可见的树木总数是多少?
我的解决方案代码
with open('day8.in') as file: forest = file.read().strip() trees = [list(x) for x in forest.split('\n')] visible = (len(trees) - 1) * 4 for i in range(1, len(trees) - 1): for j in range(1, len(trees[i]) - 1): if trees[i][j] > trees[i][j - 1]: for k in range(j - 1, -1, -1): if trees[i][k] > trees[i][j]: break if k == 0 and trees[i][k] < trees[i][j]: visible += 1 elif trees[i][j] > trees[i][j + 1]: for k in range(j + 1, len(trees[i])): if trees[i][k] > trees[i][j]: break if k == len(trees[i]) - 1 and trees[i][k] < trees[i][j]: visible += 1 elif trees[i][j] > trees[i - 1][j]: for k in range(i - 1, -1, -1): if trees[k][j] > trees[i][j]: break if k == 0 and trees[k][j] < trees[i][j]: visible += 1 elif trees[i][j] > trees[i + 1][j]: for k in range(i + 1, len(trees)): if trees[k][j] > trees[i][j]: break if k == len(trees) - 1 and trees[k][j] < trees[i][j]: visible += 1 print(visible)
遇到的问题
运行代码处理样例输入时能得到正确结果21,但处理实际的99x99网格输入时结果不符合预期。已尝试添加打印语句验证样例逻辑,未发现问题;确认初始visible变量计算正确,但实际输入过大无法手动排查错误。
内容的提问来源于stack exchange,提问作者Connor Burns
相关产品推荐
相关产品推荐

