给定一个代表我的草地、羊长n和羊毛厚度k的布尔矩阵,你将不得不计算我的羊。
绵羊是一条独立的、完整的绵羊线,长度为n,厚度为k。
#|##|# | #
#| | #|# 都是n=2,k=1.的有效绵羊吗?
##|###|## | ##
##|###| ## | ##
##| | ##|##都是n=3,k=2.的有效绵羊吗?
对角线羊必须由长度为k的水平线组成。
您将在给定的网格中计算有效羊的出现情况。
羊不会相交。你将得到保证,n,k≥1和n ≠ k.
因此,对于n=2,k=1:
##
#
## #绵羊可能就在彼此的旁边,小动物也可能出现在网格中。您应该得到从网格中可以识别的最大羊数。
由于草地在羊放牧之后变得非常短,所以您的代码也必须很短(密码-高尔夫)。
您可以任意选择字段(2D数组、字符串、布尔矩阵等)。
输出必须是单个整数≥0。
n=3, k=1
# #
# ### #
#
#
#
#Output: 3
n=1,k=4
####
####
#
#
####Output: 3
n=3, k=1
# #
##
###
#
#Output: 2
n=2, k=5
###
###
###
###
###
###Output: 1
发布于 2022-09-05 17:13:51
lambda b,n,k:max(map(len,F({r for x,R in E(b)for y,_ in E(R)for r in S(b,x,y,n,k)})))
E=enumerate
def S(b,x,y,n,k):
q=[(x,y,[],r,w,h)for r,w,h in[(0,n,k),(0,k,n),(1,k,n),(-1,k,n)]]
while q:
x,y,C,r,w,h=q.pop(0)
if h==0:yield tuple(C);continue
if x<len(b)and 0<=y and y+w<=len(b[0])and all(b[x][y:y+w]):q+=[(x+1,y+r,C+[(x,y+i)for i in range(w)],r,w,h-1)]
O=lambda x,y:any(t[0]==T[0]and t[1]>T[1]for t in x for T in y)and any(t[0]==T[0]and t[1]>T[1]for t in x for T in y)
def F(s,c=[]):
if[]==(o:=[i for i in s if all({*j}&{*i}==set()for j in c)and 0==any(O(j,i)for j in c)]):yield c
for i in o:yield from F(s-{i},c+[i])https://codegolf.stackexchange.com/questions/229582
复制相似问题