2019今日头条研发岗笔试---编程题《世界杯开幕》

题目描述:世界杯开幕式在球场C举行,球场C的球迷看台可以容纳MN个球迷。在球场售票完成后,现官方想统计此次开幕式一共有多少个球队球迷群体,最大的球队球迷群体有多少人。
经调研发现,球迷群体在选座时有以下特性:
1.同球队的球迷群体会选择相邻座位,不同球队的球迷群体会选择不相邻的座位。(注:相邻包括前后相邻,左右相邻,斜对角相邻)
2.给定一个M
N的二维球场,0代表该位置没有坐人,1表示该位置已有球迷,希望输出球迷群体个数P,最大的球队群体人数Q。

示例:         [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]
输出:6  8

分析:这个题就是一个求连通区域的题目。对区域进行标记,然后做统计即可。比较麻烦的是边界元素的处理。

import numpy as np
a = np.array([[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]
              ])
b=[[0]*10]*10
b=np.array(b)
#print(a)
h=0
cut=0
for m in range(10):
    for n in range(10):
          x=y=z=w=0
          if a[m][n]==1:
             if m>=1:
                 x=b[m-1][n]
                 if n<9:
                    y=b[m-1][n+1]
             if n>=1:
                 z=b[m][n-1]
                 if m>=1:
                    w=b[m-1][n-1]
             if x|y|z|w!=0:
               minx=max(x,y,z,w)
               if x>0 & x<minx:
                   minx=x
               if y > 0 & y < minx:
                   minx = y
               if z>0 & z<minx:
                   minx=z
               if w > 0 & w < minx:
                   minx = w
               b[m][n]=minx
               if max(x,y,z,w)!=minx:
                   if x > minx:
                       b[m - 1][n]=b[m][n]
                   if y > minx:
                       b[m - 1][n+1] = b[m][n]
                   if z > minx:
                       b[m][n-1] = b[m][n]
                   if w> minx:
                       b[m - 1][n-1] = b[m][n]
               #b[m][n]=max(x,y,z,w)
             else:
               h=h+1
               b[m][n]=h
print(b)
c=[0]*(h+1)
for m in range(10):
    for n in range(10):
        if b[m][n]!=0:
            c[b[m][n]]+=1
print("一共有"+str(len(c)-c.count(0))+"支球队")
print("人数最多的球队有"+str(max(c))+"人")
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 上次跟翔出去玩 顺便给宿舍那群猪挑礼物 那天装着逼走进一家饰品店(麻烦脑补下) 风尘仆仆(不知道什么意思就觉得很厉...
    粉切黑阅读 397评论 0 0
  • “我往何处来,无人知,我往何处去,无人明”乡间茅屋,阶下虫声,窗前竹籁,一瓶清酒,几茎咸菜,月下孤影,梦话,梦话!...
    铁拳宝宝爱芝麻阅读 260评论 0 0
  • vhjhhuisnwbbjjsjbbdbjsjj
    仇志轩阅读 50评论 0 5
  • 以拈花的姿态行于世,偶而在文字中,抚琴弄月,滴水禅音,无关风月,只为寻一份清幽,留一份真。 我喜欢这段话,是因为我...
    两餐便当阅读 890评论 0 0