2

So,preparing myself for the next ieextreme competition I was going through some past problems.I found one that really troubles me,since I can't figure out what to do.I could probably make it using some bruteforce 300 lines code,but I think that this is not what someone is supposed to do in such competitions,so I need your help!!

Detecting shapes in a bitmap

Problem statement: In image analysis, it is common to analyze a bitmap and observe the shapes present in it. For this problem, design an algorithm to detect shapes in a given bitmap. The shapes present in the map shall be from the set Square, Rectangle, Triangle and Parallelogram.

In the bitmap each pixel is represented as a bit, 1 - representing black and 0 - representing white. Participants are expected to detect the shapes outlined in black. Input The first line will contain the size of the bit map in pixels represented as (Row,Column).

E.g. 6,8 this means a bit map of 6 rows and 8 columns. The next line will contain a series of decimal digits from 0 to 255 separated by spaces. Each digit will represent a collection of 8 binary bits in the bitmap. IE. 55 represents a binary pattern 00110111.

Note: There can be multiple shapes in a bitmap and NO shapes shall intersect. However there can be shapes nested with each other without any intersection.

Output The shapes present in the bitmap in ascending order of their names, separated by a comma and a space. Eg. Rectangle, Square, Triangle

Note: There is NO linefeed or space at the end of the output If any shape repeats, the output should contain as many repetitions as in the bitmap. ie. If there are 2 squares and one triangle, the output shall be Square, Square, Triangle

Example Set 1

Input:

6 8

0 126 66 66 126 0

Output: Rectangle

Example Set 2

Input:

6 16

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

Output: Parallelogram, Square

I have written this code so that I can visualize the bitmap and have 2 lists(bitmap in rows and cols)...

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)]

Thank you for your time...Please answer if you can in Python,C++ or Ruby,since these are the languages I can understand or even algorithmically...

4

1 回答 1

3

我的方法是这样的:

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

    • 路径具有相同的长度:正方形或三角形。检查左下角像素右侧的像素来决定(黑色:正方形,白色:三角形)。
    • 路径有不同的长度:矩形或三角形(?还是应该总是 45 度?)。检查左下角像素右侧的像素来决定(黑色:矩形,白色:三角形)。
    • 其中一条路径不存在:三角形或平行四边形。假设向下的路径确实存在:检查左下角像素的右侧像素以决定(黑色:三角形,白色:平行四边形)。
  4. 删除形状并重复。

您只检查每个像素的恒定次数(不太确定该常数),因此这应该在时间上与像素数成线性关系。

于 2013-10-22T09:49:55.343 回答