【问题标题】:Museum Security algorithm challenge博物馆安全算法挑战
【发布时间】: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))

目前我尝试使用蛮力。一些边缘案例失败了

【问题讨论】:

标签: python ruby algorithm


【解决方案1】:

只要找出哪些房间被守卫在北边,哪些从东边,哪些从南边,哪些从西边,然后合并结果。

一次考虑一个基本方向,这个二维问题变成了独立的一维问题的集合。

为了解决其中一个 1D 问题(例如,确定哪些房间从西面看守),我们从西向东扫过,维护一个标志,指示西边是否有守卫,并且可以畅通无阻地看到当前房间.最初为 false,当我们扫描守卫时此标志为 true,当我们扫描墙壁时为 false。

【讨论】: