lintcode 553. 炸弹袭击
给定一个二维矩阵, 每一个格子可能是一堵墙 W,或者 一个敌人 E 或者空 0 (数字 ‘0’), 返回你可以用一个炸弹杀死的最大敌人数. 炸弹会杀死所有在同一行和同一列没有墙阻隔的敌人。 由于墙比较坚固,所以墙不会被摧毁.
code
def maxKilledEnemies(self, grid):
# write your code here
if grid is None or len(grid)==0 or len(grid[0])==0:
return 0
m = len(grid)
n = len(grid[0])
dp=[[0]*(n+2) for i in range (m+2)]
res=[[0]*(n+2) for i in range (m+2)]
result=0
if grid[0][0]=='E':
dp[0][0]=1
for i in range(1,m+1,1):
for j in range(1,n+1,1):
if grid[i-1][j-1] == 'W':
dp[i][j]=0
elif grid[i-1][j-1] =='E':
dp[i][j]=dp[i-1][j]+1
else:
dp[i][j]=dp[i-1][j]
res[i][j]=res[i][j]+dp[i][j]
for i in range(m,0,-1):
for j in range(1,n+1,1):
if grid[i-1][j-1] == 'W':
dp[i][j]=0
elif grid[i-1][j-1] =='E':
dp[i][j]=dp[i+1][j]+1
else:
dp[i][j]=dp[i+1][j]
res[i][j]=res[i][j]+dp[i][j]
for i in range(1,m+1,1):
for j in range(1,n+1,1):
if grid[i-1][j-1] == 'W':
dp[i][j]=0
elif grid[i-1][j-1] =='E':
dp[i][j]=dp[i][j-1]+1
else:
dp[i][j]=dp[i][j-1]
res[i][j]=res[i][j]+dp[i][j]
for i in range(1,m+1,1):
for j in range(n,0,-1):
if grid[i-1][j-1] == 'W':
dp[i][j]=0
elif grid[i-1][j-1] =='E':
dp[i][j]=dp[i][j+1]+1
else:
dp[i][j]=dp[i][j+1]
res[i][j]=res[i][j]+dp[i][j]
for i in range(1,m+1,1):
for j in range(1,n+1,1):
if grid[i-1][j-1]=='0':
if res[i][j]>result:
result=res[i][j]
return result
想法
1.if grid is None or len(grid)==0 or len(grid[0])==0:要在 m = len(grid)
n = len(grid[0]) 的前面进行判定。
2.四个方向,从上到下,从下到上,,从右到左,从左到右。相对应的检索方向也会发生对应的改变。
3. elif grid[i-1][j-1] ==‘E’:
dp[i][j]=dp[i][j+1]+1
的意思是,在 for i in range(1,m+1,1):
for j in range(n,0,-1)检索规则下,dp[i][j]的前一个被检索到的数是E的话,那么在dp[i][j]可以达成的数目+1.