【发布时间】:2017-11-06 10:04:26
【问题描述】:
问题描述:
给定一个 2D 网格,每个单元格要么是墙“W”、敌人“E”或空“0”(数字 0),返回使用一颗炸弹可以杀死的最大敌人。
由于墙壁太坚固而无法摧毁,炸弹会从种植点杀死同一行和同一列中的所有敌人,直到它撞到墙上。
请注意,您只能将炸弹放在空单元格中。
Example:
For the given grid
0 E 0 0
E 0 W E
0 E 0 0
return 3. (Placing a bomb at (1,1) kills 3 enemies)
我的 DFS 解决方案:
def maxKilledEnemies(grid):
"""
:type grid: List[List[str]]
:rtype: int
"""
l_row, l_col = len(grid), len(grid[0])
visited = [[False] * l_col for _ in range(l_row)] #using this array to avoid duplicate traverse.
def dfs(i, j):
if 0 <= i < l_row and 0 <= j < l_col and not visited[i][j]:
visited[i][j] = True
if grid[i][j] == 'W': #wall return 0
return 0
elif grid[i][j] == '0': #0 means we just ignore this cell and traverse it adjacents
top_val = dfs(i - 1, j)
down_val = dfs(i + 1, j)
left_val = dfs(i, j - 1)
right_val = dfs(i, j + 1)
return left_val + right_val + top_val + down_val
elif grid[i][j] == 'E': # Enemy and we add it by 1
top_val = dfs(i - 1, j)
down_val = dfs(i + 1, j)
left_val = dfs(i, j - 1)
right_val = dfs(i, j + 1)
return left_val + right_val + top_val + down_val + 1
return 0
ret = [0]
for i in range(l_row):
for j in range(l_col):
if not visited[i][j] and grid[i][j] == '0':
val = dfs(i, j)
ret[0] = max(val, ret[0])
return ret[0]
Solution().maxKilledEnemies([["0","E","0","0"],["E","0","W","E"],["0","E","0","0"]]) #return 4 but expect 3.
这个想法很简单,对于每个 num 为 0 的单元格,我们遍历它 4 方向(上/下/左/右)。
我知道还有其他方法可以更智能地解决它。但我想弄清楚为什么我的方法不起作用?
【问题讨论】: