所以,为下一次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,请回答,因为这些是我能理解的语言,甚至算法......
答案 0 :(得分:2)
我的方法是:
3例:
删除形状并重复。
您只检查每个像素一次(不太确定该常数),因此这应该以像素数的时间线性运行。