问题描述:
世界杯开幕式会在球场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)))
有问题,记得批评指正哦。