选择图中最佳可能的初始位置以最大化潜在邻居

时间:2014-03-08 16:25:35

标签: algorithm graph-theory breadth-first-search

A grid is described by an N by N grid of square cells  (1 <= N <= 400).
The cell in row r and column c (1 <= r,c <= N) contains
x units of food (0 <= x <= 1000).  From some initial square in
the grid, you are only willing to take up to K steps (0 <= K <= 2*N).
Each step you take moves you to a cell that is directly north, south,
east, or west of your current location.

假设网格如下,其中(Y)描述了你的网格 初始位置(此处,第3行,第3列):

50    5     25*   6     17    
14    3*    2*    7*    21    
99*   10*   1*(B) 2*    80*    
8     7*    5*    23*   11  
10    0     78*   1     9    

当K的值为2时,您只能到达标有* s的位置。

确定您可以达到的最大食物量,如果 你在网格中选择了最好的初始位置。

输入格式:

  • 第1行:整数N和K。

  • 第2..1 + N行:第r + 1行包含描述第r行的N个整数     网格。每个整数给出指定位置的食物量。

示例输入:

5 2
50 5 25 6 17
14 3 2 7 21
99 10 1 2 80
8 7 5 23 11
10 0 78 1 9

输出格式:

  • 第1行:如果您愿意,您可以获得的最大食物量     最好的初始位置(从哪个位置开始     你可以获得最多的食物。)

示例输出:

342

详情:

在上面的示例中,如果您可以达到342个单位的食物 把自己定位在网格的中间。这是您可以达到的最大食物量。

我的想法:

我正在考虑使用一些使用广度优先搜索的方法,因为每个步骤具有相同的成本1,但我不确定这是否正确或如何实现它。如果你能帮忙建议一些算法或给出非常有帮助的伪代码。我有一个笨拙的解决方案,但在N和K的大值上花了太长时间。我试图让这个在N和K的大例子下运行不到1毫秒。

更新: 我的主要问题是如何在不尝试每个可能的菱形总和的情况下找到最佳起点。我需要这个在1毫秒以内运行(基本上最大操作数应该是2.5亿)

2 个答案:

答案 0 :(得分:1)

一个O(N ^ 2)方法是使用变换

将点旋转45度
x,y -> x+y,x-y

(这也会将图像缩放因子sqrt(2))。

完成此操作后,您现在需要在正方形中找到求和值,使用summed area table可以有效地完成。

这需要O(N ^ 2)预处理来计算积分图像,加上O(1)来找到每个正方形中的值。有N ^ 2个位置要测试,导致总体O(N ^ 2)复杂度。

答案 1 :(得分:0)

我不是真正提供BFS解决方案,因为我不认为这是必要的。你看,你总能走在一个倾斜的广场上:

O O O O O X X X O O
O O O O X X Z X X O
O O O O O X X X O O
O O O O O O X O O O

像这样,如果你的起始位置是Z。所以基本上你只需要找到具有最高总和的倾斜方块。

碰巧,编写一个公式是否很容易在菱形中包含一个瓷砖。它只是:

abs(<center_x>) + abs(<center_y>) >= abs(<checked_tile_x>) + abs(<checked_tile_y)

然后你将解决方案将结束两个for循环,用于将每个tile检查为中心tile,另一个将当前tile添加到临时变量,如果根据上面的公式,当前tile在菱形中。

请注意,还有一些方法可以遍历菱形中的所有瓷砖(如果K比方形尺寸小很多,效率会更高)。类似的东西:

for r from -K to K:
    for c from -(K - abs(r)) to (K - abs(r)):
        Point is <center_y> + r, <center_x> + c