Skip to content

Commit

Permalink
Merge pull request keon#153 from christianbender/changed_bomb_enemy
Browse files Browse the repository at this point in the history
Changed bomb_enemy.py in directory matrix
  • Loading branch information
goswami-rahul authored Mar 20, 2018
2 parents 81ef2e7 + 1f03d2f commit 3615e6e
Showing 1 changed file with 55 additions and 24 deletions.
79 changes: 55 additions & 24 deletions matrix/bomb_enemy.py
Original file line number Diff line number Diff line change
@@ -1,42 +1,48 @@
# Given a 2D grid, each cell is either a wall 'W',
# an enemy 'E' or empty '0' (the number zero),
# return the maximum enemies you can kill using one bomb.
# The bomb kills all the enemies in the same row and column from
# the planted point until it hits the wall since the wall is too strong
# to be destroyed.
# Note that you can only put the bomb at an empty cell.
"""
Given a 2D grid, each cell is either a wall 'W',
an enemy 'E' or empty '0' (the number zero),
return the maximum enemies you can kill using one bomb.
The bomb kills all the enemies in the same row and column from
the planted point until it hits the wall since the wall is too strong
to be destroyed.
Note that you can only put the bomb at an empty cell.
# Example:
# For the given grid
Example:
For the given grid
# 0 E 0 0
# E 0 W E
# 0 E 0 0
0 E 0 0
E 0 W E
0 E 0 0
# return 3. (Placing a bomb at (1,1) kills 3 enemies)
return 3. (Placing a bomb at (1,1) kills 3 enemies)
"""

def max_killed_enemies(grid):
if not grid: return 0
m, n = len(grid), len(grid[0])
max_killed = 0
row_e, col_e = 0, [0] * n
# iterates over all cells in the grid
for i in range(m):
for j in range(n):
# makes sure we are next to a wall.
if j == 0 or grid[i][j-1] == 'W':
row_e = row_kills(grid, i, j)

# makes sure we are next to a wall.
if i == 0 or grid[i-1][j] == 'W':
col_e[j] = col_kills(grid, i, j)

# makes sure the cell contains a 0
if grid[i][j] == '0':
# updates the variable
max_killed = max(max_killed, row_e + col_e[j])

return max_killed

# calculate killed enemies for row i from column j
def row_kills(grid, i, j):
num = 0
while j < len(grid[0]) and grid[i][j] != 'W':
len_row = len(grid[0])
while j < len_row and grid[i][j] != 'W':
if grid[i][j] == 'E':
num += 1
j += 1
Expand All @@ -45,18 +51,43 @@ def row_kills(grid, i, j):
# calculate killed enemies for column j from row i
def col_kills(grid, i, j):
num = 0
while i < len(grid) and grid[i][j] != 'W':
len_col = len(grid)
while i < len_col and grid[i][j] != 'W':
if grid[i][j] == 'E':
num += 1
i += 1
return num



# ----------------- TESTS -------------------------

"""
Testsuite for the project
"""

import unittest

grid = [
["0", "E", "0", "E"],
["E", "E", "E", "0"],
["E", "0", "W", "E"],
["0", "E", "0", "0"]]
print(grid)
class TestBombEnemy(unittest.TestCase):
def test_3x4(self):
grid1 = [["0","E","0","0"],
["E","0","W","E"],
["0","E","0","0"]]
self.assertEqual(3,max_killed_enemies(grid1))
def test_4x4(self):
grid1 = [
["0", "E", "0", "E"],
["E", "E", "E", "0"],
["E", "0", "W", "E"],
["0", "E", "0", "0"]]
grid2 = [
["0", "0", "0", "E"],
["E", "0", "0", "0"],
["E", "0", "W", "E"],
["0", "E", "0", "0"]]
self.assertEqual(5,max_killed_enemies(grid1))
self.assertEqual(3,max_killed_enemies(grid2))

print(max_killed_enemies(grid))
if __name__ == "__main__":
unittest.main()

0 comments on commit 3615e6e

Please sign in to comment.