检测“位图”中的形状

时间:2013-10-22 09:06:50

标签: algorithm bitmap find shapes

所以,为下一次ieextreme比赛做好准备,我正在经历一些过去的问题。我找到了一个让我很烦恼,因为我无法弄清楚要做什么。我可能会使用一些bruteforce 300行代码,但我认为这不是某人应该在这样的比赛中做的事情,所以我需要你的帮助!!

检测位图中的形状

问题陈述:在图像分析中,通常分析位图并观察其中存在的形状。对于此问题,设计一种算法来检测给定位图中的形状。地图中存在的形状应来自方形,矩形,三角形和平行四边形。

在位图中,每个像素表示为一位,1 - 表示黑色,0 - 表示白色。预计参与者将检测黑色轮廓的形状。输入第一行将包含位图的大小(以像素为单位),表示为(行,列)。

E.g。 6,8这意味着6行和8列的位图。下一行将包含一系列从空格开始的0到255之间的十进制数字。每个数字代表位图中8个二进制位的集合。 IE浏览器。 55表示二进制模式00110111。

注意:位图中可以有多个形状,NO形状应相交。然而,可以存在彼此嵌套的形状而没有任何交叉。

输出位图中按名称的升序显示的形状,以逗号和空格分隔。例如。矩形,正方形,三角形

注意:输出末尾没有换行符或空格如果任何形状重复,则输出应包含与位图一样多的重复。即。如果有2个正方形和一个三角形,则输出应为正方形,正方形,三角形

示例集1

输入:

6 8

0 126 66 66 126 0

输出:矩形

示例集2

输入:

6 16

0 0 120 120 72 144 73 32 123 192 0 0

输出:平行四边形,方形

我编写了这段代码,这样我就能看到位图并有2个列表(行和列中的位图)......

rows,cols=(int(i) for i in raw_input().split())
nums=[int(n) for n in raw_input().split()]
mr=[]
for i in range(0,len(nums),cols/8):
    row=''
    for j in range(i,i+cols/8):
        b=bin(nums[j])[2:]
        b='0'*(8-len(b))+b
        row+=b
    mr.append(row)
mc=[''.join([mr[i][j] for i in range(rows)]) for j in range(cols)]

感谢您的时间......如果您能使用Python,C ++或Ruby,请回答,因为这些是我能理解的语言,甚至算法......

1 个答案:

答案 0 :(得分:2)

我的方法是:

  1. 找到第一个黑色像素(最左上角或最左上角)。
  2. 向右和向下追踪黑色路径(即循环,直至击中白色像素)。
  3. 3例:

    • 路径长度相同:方形或三角形。检查左下角像素的右侧像素(黑色:方形,白色:三角形)。
    • 路径长度不同:矩形或三角形(?或者它们应该总是45度?)。检查底部左侧像素的右侧像素(黑色:矩形,白色:三角形)。
    • 其中一条路径不存在:三角形或平行四边形。假设的路径存在:检查底部左侧像素的右侧像素(黑色:三角形,白色:平行四边形)。
  4. 删除形状并重复。

  5. 您只检查每个像素一次(不太确定该常数),因此这应该以像素数的时间线性运行。