如果我有这样的二进制数-0b1110111110011011011010001000,并且我会传播5位,那么它看起来像:
11101 # 29
11110 # 30
01101 # 13
10110 # 22
01000 # 8
除了右边下方的0110/1000外,每个0都将被视为孤立的零,因此,首先,我编码为查找“ 101”,以查找
?1?
101
1 -它将在数组中找到孤立的零。
数组为[29,30,13,22,8]并使用字符串,
def find_closed(array,width = 5):
new_arr = ['1'*(width+2)]+['1'+bin(x)[2:]+'1' for x in array]+['1'*(width+2)]
for each in range(len(array)):
a = new_arr[each+1].find('101') +1
if a and int(new_arr[each][a]) &int(new_arr[each+2][a]):
return each+1,a
return False
因此代码将指出(1,4),第4行,第1列。
好吧,我是通过位移来实现的,
def bit_closed(array,width = 5):
new_arr = [2**(width+2)-1]+[2**(width+1)+2*x+1 for x in array]+[2**(width+2)-1]
for each in range(len(array)):
for shift in range(width):
if not ((new_arr[each+1]>>shift)-5)%8 and (new_arr[each]>>(shift+1))%2 and (new_arr[each+2]>>(shift+1))%2:
return each+1, width - shift
return False
实际上,我相信使用列表循环可能会更短。无论如何,还有更好的方法吗?
答案 0 :(得分:0)
如果我们将2D列表[[],[],...]作为输入,
def matrix_closed(small):
org = small[:]
for objs in org:
objs.append(1)
org.append([1]*len(objs))
n=0
for lines in org[:-1]:
x=0
for points in lines[:-1]:
if not points and all((org[n-1][x],org[n+1][x],org[n][x-1],org[n][x+1])):
return n,x
x+=1
n+=1
return False
它会在python中更快地工作,因为python本身不支持二进制数组。时间花费在函数调用上,而不是花一点时间。