【问题标题】:Dynamic Programming - Graph Theory动态规划 - 图论
【发布时间】:2016-03-19 07:33:58
【问题描述】:

你在一个大的 NxN 网格中,有 (2

您从房间 (1,1) 开始,这是唯一一个最初“开启”的房间。在一些 房间里,你会发现电灯开关,你可以用它来切换 其他房间的状态;例如房间里可能有一个开关 (1,1) 在开和关之间切换房间 (1,2) 的状态。你可以 只能通过“on”房间,并且只能从房间 (x,y) 移动到 它的四个相邻邻居 (x−1,y)、(x+1,y)、(x,y−1) 和 (x,y+1)(或 如果这个房间在网格的边界上,邻居可能会更少)。

找出您可以“开启”的最大房间数。

示例:输入的第一行包含整数 N 和 M (1≤M≤20,000)。

接下来的 M 行每行描述一个带有四个的电灯开关 整数 x, y, a, b,房间 (x,y) 中的开关可用于切换 (a,b) 房间的状态。任何房间都可能存在多个开关,并且 多个开关可以切换任何房间的状态。

输出:单行给出您可以打开的最大房间数 '开'。

样本输入:

3 6
1 1 1 2
2 1 2 2
1 1 1 3
2 3 3 1
1 3 1 2
1 3 2 1

样本输出:

5

我自己完成了这个例子。我发现的最大情况是当你在 (1,1) 中时,你打开 (1,2) 和 (1,3)。然后转到 (1,3) 并打开 (2,1)。然后前往 (2,1) 并打开 (2,2)。但是,您无法到达 (2,3),因为它仍处于“关闭”状态。最多可提供 5 个“开”的房间。

到目前为止我的方法:

我认为这可能是动态编程或贪心程序。由于 N 的界限非常低,我在想每次访问一个节点时,都会更新可能的可访问地点的数量。也可能有一种方法,您只尝试找到打开开关的地方并尝试前往那里。

您能否指出一个算法来解决这个问题,也许还有一些伪代码,因为我对这些类型的问题有点陌生。

【问题讨论】:

    标签: java c++ algorithm graph dynamic-programming


    【解决方案1】:

    这可以通过对图进行修改的广度优先搜索来解决。首先,从当前房间点亮所有可能的房间是有意义的。要点亮最大数量的房间,我们必须找到从(1,1) 可以到达的所有房间(意味着有一条从(1,1)经过点亮房间的路径)然后点亮的房间是可以从这些“可达”房间中的每一个点亮的所有房间的联合。我们一一探索可到达的房间,找到可以点亮的房间。这可能会为我们提供更多可到达的房间。

    完整的pseudo-code 是:

    queue Q
    Q.push (1,1) // room (1,1) reachable
    set litupRooms
    litupRooms.push(1,1) // room (1,1) is lit up
    set visitedRooms
    while (Q is not empty)
      room r = Q.pop ()
      if r is in visitedRooms
        continue
      add r to visitedRooms
      for every room that can be lit up from r
        if it is already lit up
          continue
        add it to litupRooms 
        push it to Q if it is adjacent to a room already visited
      for every adjacent room of r
        push it to Q if it is lit up and not visited
    return the size of litupRooms
    

    【讨论】:

      猜你喜欢
      • 2012-04-26
      • 1970-01-01
      • 2022-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多