算法题 - 世界杯开幕式 - Python

189 篇文章 3 订阅

问题描述:

世界杯开幕式

世界杯开幕式会在球场C举行,球场C的球迷看台可以容纳 M*N个球迷。在球场售票完成后,现官方想统计此次开幕式一共有多少个球队球迷群体,最大的球队球迷群体有多少人。

  • 同球队的球迷群体会选择相邻座位,不同球队的球迷群体会选择不相邻的座位。(注解:相邻包括前后相邻、左右相邻、斜对角相邻。)

  • 给定一个M*N的二维球场,0代表该位置没人坐,1代表该位置有球迷,希望输出球队群体的个数P, 最大的球队群体人数Q

问题分析:

广度优先搜索。

Python3实现:

# 今日头条-算法工程师内推-编程题1(笔试时间2018-08-12 10:00~12:00)
# 解题思路 广度优先搜索,用队列实现,每次进队,就进行累计球队人数
# @Time   :2018/08/12
# @Author :LiuYinxing


def getSum(i, j, n, m, maps):  # [i, j]单阵入口,[n,m]矩阵维度数,maps矩阵
    queue, sump, maps[i][j] = [[i, j]], 1, 0  # 初始化队列
    while queue:
        x, y = queue[0][0], queue[0][1]  # 获取队列头元素
        for dx, dy in zip((-1, -1, 0, 1, 1, 1, 0, -1), (0, 1, 1, 1, 0, -1, -1, -1)):  # 8个方向
            nx, ny = x + dx, y + dy
            if -1 < nx < n and -1 < ny < m and maps[nx][ny] != 0:
                queue.append([nx, ny])  # 入队
                sump += maps[nx][ny]  # 累计球队人数
                maps[nx][ny] = 0  # 累计过的位置设置为0
        del queue[0]  # 出队
    return sump  # 返回其中一个球队的人数总和


if __name__ == '__main__':
    maps = [[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
            [0, 0, 0, 1, 1, 0, 1, 0, 0, 0],
            [0, 1, 0, 0, 0, 0, 0, 1, 0, 1],
            [1, 0, 0, 0, 0, 0, 0, 0, 1, 1],
            [0, 0, 0, 1, 1, 1, 0, 0, 0, 1],
            [0, 0, 0, 0, 0, 0, 1, 0, 1, 1],
            [0, 1, 1, 0, 0, 0, 0, 0, 0, 0],
            [0, 0, 0, 1, 0, 1, 0, 0, 0, 0],
            [0, 0, 1, 0, 0, 1, 0, 0, 0, 0],
            [0, 1, 0, 0, 0, 0, 0, 0, 0, 0]]
    n, m = 10, 10  # 输入行列

    team = []
    for i in range(n):
        for j in range(m):
            if maps[i][j] != 0: team.append(getSum(i, j, n, m, maps))  # 获取每个球队和
    print(str(len(team)) + ',' + str(max(team)))

有问题,记得批评指正哦。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值