[python]## lintcode 553. 炸弹袭击 给定一个二维矩阵,

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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值