阿里巴巴-笔试前的测验题:星球大战

题目要求:

阿里笔试前的编程测验题,具体的题目要求很长,我已经给忘记了敲打,大概意思就是,给你一个由0和1组成的矩阵,例如下面这个矩阵:

maps = [[1, 1, 0, 1, 1, 0, 0],
        [1, 0, 1, 1, 0, 0, 1],
        [1, 1, 1, 1, 1, 1, 1],
        [0, 1, 0, 1, 0, 1, 1],
        [1, 0, 1, 1, 1, 1, 0],
        [1, 1, 0, 1, 1, 0, 1]]

让你选择一个位置,这个位置必须是1,而且从这个位置出发(上,下,左,右)可以打到飞机数最多,1代表飞机,0代表陨石(不可到达),输出的结果要求是一个坐标信息,如果存在相同的结果,应该都输出出来。

题目分析:

很显然,使用暴力解法时间复杂度为O(n3), 在这里采用动态规划思想,时间复杂度为O(n2),从上下左右四个方向出发,分别代表一个单维的数组进行dp操作。

Python3 实现:

# @Time   :2018/5/8
# @Author :LiuYinxing

maps = [[1, 1, 0, 1, 1, 0, 0],
        [1, 0, 1, 1, 0, 0, 1],
        [1, 1, 1, 1, 1, 1, 1],
        [0, 1, 0, 1, 0, 1, 1],
        [1, 0, 1, 1, 1, 1, 0],
        [1, 1, 0, 1, 1, 0, 1]]
n, m = 6, 7  # 行列

dp1 = [[0]*m for _ in range(n)]  # 上
dp2 = [[0]*m for _ in range(n)]  # 右
dp3 = [[0]*m for _ in range(n)]  # 下
dp4 = [[0]*m for _ in range(n)]  # 左

for i in range(m): dp1[0][i], dp3[n-1][i] = maps[0][i], maps[n-1][i]  # 初始化
for i in range(n): dp2[i][m-1], dp4[i][0] = maps[i][m-1], maps[i][0]

for i in range(n):  # 从左--->右计算
    for j in range(1, m):
        dp4[i][j] = 0 if maps[i][j] == 0 else dp4[i][j-1] + maps[i][j]

for i in range(n):  # 从右--->左计算
    for j in range(m-2, -1, -1):
        dp2[i][j] = 0 if maps[i][j] == 0 else dp2[i][j+1] + maps[i][j]

for j in range(m):  # 从上--->下计算
    for i in range(1, n):
        dp1[i][j] = 0 if maps[i][j] == 0 else dp1[i-1][j] + maps[i][j]

for j in range(m):  # 从下--->上计算
    for i in range(n-2, -1, -1):
        dp3[i][j] = 0 if maps[i][j] == 0 else dp3[i+1][j] + maps[i][j]

idm = 0
pathid = []
for i in range(n):  # 获取结果
    for j in range(m):
        dp1[i][j] = dp1[i][j] + dp2[i][j] + dp3[i][j] + dp4[i][j] - (3*maps[i][j])
        if dp1[i][j] > idm:  # 更新最大值
            idm, pathid= dp1[i][j], [[i,j]]
        elif dp1[i][j] == idm:  # 保留最大值
            pathid.append([i,j])

print(pathid)

程序简化一下:

# @Time   :2018/5/8
# @Author :LiuYinxing

maps = [[1, 1, 0, 1, 1, 0, 0],
        [1, 0, 1, 1, 0, 0, 1],
        [1, 1, 1, 1, 1, 1, 1],
        [0, 1, 0, 1, 0, 1, 1],
        [1, 0, 1, 1, 1, 1, 0],
        [1, 1, 0, 1, 1, 0, 1]]
n, m = 6, 7  # 行列

dp1 = [[0]*m for _ in range(n)]  # 上
dp2 = [[0]*m for _ in range(n)]  # 右
dp3 = [[0]*m for _ in range(n)]  # 下
dp4 = [[0]*m for _ in range(n)]  # 左

for i in range(m): dp1[0][i], dp3[n-1][i] = maps[0][i], maps[n-1][i]  # 初始化
for i in range(n): dp2[i][m-1], dp4[i][0] = maps[i][m-1], maps[i][0]

for i in range(n):  # 一行一行的计算
    for j in range(1, m):  # 从左--->右计算
        dp4[i][j] = [0, dp4[i][j-1] + maps[i][j]][maps[i][j]]

    for j in range(m-2, -1, -1):  # 从右--->左计算
        dp2[i][j] = [0, dp2[i][j+1] + maps[i][j]][maps[i][j]]

for j in range(m):  # 一列一列的计算
    for i in range(1, n):  # 从上--->下计算
        dp1[i][j] = [0, dp1[i-1][j] + maps[i][j]][maps[i][j]]

    for i in range(n-2, -1, -1):  # 从下--->上计算
        dp3[i][j] = [0, dp3[i+1][j] + maps[i][j]][maps[i][j]]


idm = 0
pathid = []
for i in range(n):  # 获取结果
    for j in range(m):
        dp1[i][j] = dp1[i][j] + dp2[i][j] + dp3[i][j] + dp4[i][j] - (3*maps[i][j])
        if dp1[i][j] > idm:  # 更新最大值
            idm, pathid= dp1[i][j], [[i,j]]
        elif dp1[i][j] == idm:  # 保留最大值
            pathid.append([i,j])

print(pathid)

发现问题,可以留言指教哦。小白一个害羞

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值