【发布时间】:2022-06-14 13:47:49
【问题描述】:
假设您被要求验证博物馆的安全是否符合标准。
你会得到一个包含所有守卫和墙壁位置的平面图:
4 6
0 0 g
0 1 w
1 1 g
2 2 w
2 3 g
第一行描述了博物馆的尺寸,即 m x n 矩形(在本例中为 4 x 6)。 m 和 n 总是大于 0。
随后的行对应于警卫的位置(指定为“g”)和 墙壁(指定为“w”)。例如,“0 0 g”表示有一个 守卫在 (0, 0)。
守卫不会移动,但可以守卫任何一排房间:
直接在它们的北部、东部、南部或西部
畅通无阻(即它们之间没有墙)
例如,(0, 0)处的守卫只能守卫(1, 0)、(2, 0)和(3, 0)。
而 (2, 3) 的守卫可以守卫 (0, 3)、(1, 3)、(2, 4)、(2, 5) 和 (3, 3)。
上面的博物馆看起来像:
0 1 2 3 4 5
0 g w -
1 - g - - - -
2 - - w g - -
3 - - -
有人看守的房间标有“-”。
给定一个博物馆,请按以下格式打印您的解决方案:
false
0 2
0 4
0 5
3 2
3 4
3 5
如果博物馆有无人看守的房间,第一行应该是“false”,而第一行应该是“true” 如果博物馆没有无人看守的房间。
如果为“false”,后续行应该是无人看守房间的坐标。
无人看守的房间应按 (x, y) 升序排列。
到目前为止我已经尝试过什么
def checkUnguarded(arr, v)
i = 0
while i < arr.length do
j = 0
while j < arr[0].length do
if(arr[i][j]=='g')
r=i
c=j
k=r-1
while(k>=0&&(arr[k][c]=='w')) do
v[k][c]=true
k -= 1
end
k=r+1
while(k<arr.length&&(arr[k][c]=='w')) do
#binding.pry
v[k][c]=true
k += 1
end
k=c+1
while(k < arr[0].length && (arr[r][k]) == 'w') do
v[r][k]=true;
k += 1
end
k=c-1
while(k>=0 && (arr[r][k])=='w') do
v[r][k]=true
k -= 1
end
end
j += 1
end
i += 1
end
end
arr = [
[0, 0, 'g'],
[0, 1, 'w'],
[1, 1, 'g'],
[2, 2, 'w'],
[2, 3, 'g']
]
v = [
[0, 0],
[0, 0],
[0, 0],
[0, 0],
[0, 0],
]
puts(checkUnguarded(arr, v))
目前我尝试使用蛮力。一些边缘案例失败了
【问题讨论】:
-
这可能会帮助您更好地思考:en.wikipedia.org/wiki/Art_gallery_problem
-
@AmiraliAmirifar 以上链接与NP难题有关。我不认为上述问题与它有关