算法题 - 世界杯开幕式 - 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 :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)))
有问题,记得批评指正哦。