如何递归和迭代地在盒子内划分盒子?
How to keep dividing a box inside box recursively and iteratively?
class Point:
def __init__(self, x, y):
self.x=x
self.y=y
class Rect:
def __init__(self, up, dw):
self.up=up
self.dw=dw
self.next=[]
def next_empty(self):
return len(self.next)<=0
def inside(p1, p2, p3):
return p3.x>=p1.x and p3.y<=p1.y and p3.x<=p2.x and p3.y>=p3.y
def create_box(root, parts):
width=root.dw.x-root.up.x
height=root.up.y-root.dw.y
divx=width/parts
divy=height/parts
x=y=0
for _y in range(parts):
for _x in range(parts):
rect=Rect(up=Point(x, y+divy), dw=Point(x+divx, y))
root.next.append(rect)
x+=divx
x=0
y+=divy
return True
def create_tree(root, parts, n=2):
pass
up=Point(0, 180)
dw=Point(360, 0)
root=Rect(up, dw)
#create_tree(root, 20)
上面的代码有两个class点和矩形。 Point表示图形上的一个点,Rect表示一个矩形,'Rect.up'属性是左上点,'Rect.dw'是右下点。
create_box 函数将给定的矩形对象分成 parts*parts 个矩形,并将其保存在 'Rect.next' 数组中。所以第一个 rect 是 up=(18, 0) dw=(18,0),第二个 up=(18, 18) dw=(36, 0)。
我有一个 create_tree 函数可以创建 n 个节点的树,但我在这里遇到了一些问题。例如:首先创建树会将根分成 x 个部分,这些 x 个部分将再次分成 x 个部分,类似地,这个过程将继续,直到达到 n 个节点。
我希望 create_tree 函数在以下行为中起作用:-
def create_tree(root, parts, n=2):
root_arr=[root]
# when n=1
if n==1:
for r in root_arr:
create_box(r, parts)
#when n=2
if n==2:
for r in root_arr:
create_box(r, parts)
for r in root_arr:
for j in r.next:
create_box(j, parts)
# when n=3
if n==3:
for r in root_arr:
create_box(r, parts)
for r in root_arr:
for j in r.next:
create_box(j, parts)
for r in root_arr:
for j in r.next:
for q in j.next:
create_box(q, parts)
# N can be any number
我在添加这种循环时遇到了问题。使用递归和迭代应该如何解决?
使用 DFS 方法,您可以编写一个递归函数来包装盒子创建任务:
def create_boxes_recursively(root, parts, levels):
root_arr = [root]
create_box(root, parts)
if levels==1:
return
if not root.next:
return
for j in root.next:
create_boxes_recursively(j, parts, levels-1)
至于迭代,您可以使用 BFS 方法,它会跟踪下一级的所有节点:
def create_boxes_iteratively(root, parts, levels):
next_nodes = [root]
curr_level = 0
while next_nodes and curr_level<levels:
temp_array = []
for node in next_nodes:
create_box(node, parts)
temp_array += node.next
curr_level += 1
next_nodes = temp_array
class Point:
def __init__(self, x, y):
self.x=x
self.y=y
class Rect:
def __init__(self, up, dw):
self.up=up
self.dw=dw
self.next=[]
def next_empty(self):
return len(self.next)<=0
def inside(p1, p2, p3):
return p3.x>=p1.x and p3.y<=p1.y and p3.x<=p2.x and p3.y>=p3.y
def create_box(root, parts):
width=root.dw.x-root.up.x
height=root.up.y-root.dw.y
divx=width/parts
divy=height/parts
x=y=0
for _y in range(parts):
for _x in range(parts):
rect=Rect(up=Point(x, y+divy), dw=Point(x+divx, y))
root.next.append(rect)
x+=divx
x=0
y+=divy
return True
def create_tree(root, parts, n=2):
pass
up=Point(0, 180)
dw=Point(360, 0)
root=Rect(up, dw)
#create_tree(root, 20)
上面的代码有两个class点和矩形。 Point表示图形上的一个点,Rect表示一个矩形,'Rect.up'属性是左上点,'Rect.dw'是右下点。
create_box 函数将给定的矩形对象分成 parts*parts 个矩形,并将其保存在 'Rect.next' 数组中。所以第一个 rect 是 up=(18, 0) dw=(18,0),第二个 up=(18, 18) dw=(36, 0)。 我有一个 create_tree 函数可以创建 n 个节点的树,但我在这里遇到了一些问题。例如:首先创建树会将根分成 x 个部分,这些 x 个部分将再次分成 x 个部分,类似地,这个过程将继续,直到达到 n 个节点。 我希望 create_tree 函数在以下行为中起作用:-
def create_tree(root, parts, n=2):
root_arr=[root]
# when n=1
if n==1:
for r in root_arr:
create_box(r, parts)
#when n=2
if n==2:
for r in root_arr:
create_box(r, parts)
for r in root_arr:
for j in r.next:
create_box(j, parts)
# when n=3
if n==3:
for r in root_arr:
create_box(r, parts)
for r in root_arr:
for j in r.next:
create_box(j, parts)
for r in root_arr:
for j in r.next:
for q in j.next:
create_box(q, parts)
# N can be any number
我在添加这种循环时遇到了问题。使用递归和迭代应该如何解决?
使用 DFS 方法,您可以编写一个递归函数来包装盒子创建任务:
def create_boxes_recursively(root, parts, levels):
root_arr = [root]
create_box(root, parts)
if levels==1:
return
if not root.next:
return
for j in root.next:
create_boxes_recursively(j, parts, levels-1)
至于迭代,您可以使用 BFS 方法,它会跟踪下一级的所有节点:
def create_boxes_iteratively(root, parts, levels):
next_nodes = [root]
curr_level = 0
while next_nodes and curr_level<levels:
temp_array = []
for node in next_nodes:
create_box(node, parts)
temp_array += node.next
curr_level += 1
next_nodes = temp_array