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

问题描述:

世界杯开幕式

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

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

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

问题分析:

广度优先搜索。

Python3实现:

# 今日头条-算法工程师内推-编程题1(笔试时间2018-08-12 10:00~12:00)
# 解题思路 广度优先搜索,用队列实现,每次进队,就进行累计球队人数
# @Time   :2018/08/12
# @Author :LiuYinxingdef 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 + dyif -1 < nx < n and -1 < ny < m and maps[nx][ny] != 0:queue.append([nx, ny])  # 入队sump += maps[nx][ny]  # 累计球队人数maps[nx][ny] = 0  # 累计过的位置设置为0del 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)))

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


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部