我需要使用Python程序中的AI算法来安排和/或将2D瓷砖铺设到一个2D的正方形或矩形平面上。每个瓷砖都有长度和宽度。例如,如果一个平面是4×3,并且一组瓷砖是
S={(2,3),(1,2),(2,2)}
这些瓷砖可以旋转90度以适应矩阵。
输入第一行包含平面的长度和宽度,第二行是瓷砖的数量,然后是后续瓷砖的长度和宽度
但输入应以制表符分隔
例如
4 332 31 22 2
输出例如
1 1 2 21 1 3 31 1 3 3
我解决这个问题时遇到了困难,因为我只能使用Python的标准库,不能使用NumPy和CSP库
~编辑 2`到目前为止我的代码,我不知道如何在没有CSP库的情况下添加算法或生成网格
from sys import stdina = stdin.readline()x = a.split()rectangular_plane = [[0] * int(x[0]) for i in range(int(x[1]))]num_of_rectangles = stdin.readline()r_widths = []r_lengths= []for l in range(int(num_of_rectangles)): b = stdin.readline() y = b.split()r_lengths.insert(l,y[0])r_widths.insert(l,y[1])
回答:
我已经使用回溯方法解决了这个问题,并且没有使用任何非标准模块。
import sysnums = list(map(int, sys.stdin.read().split()))pw, ph = nums[0:2]ts = list(zip(nums[3::2], nums[4::2]))assert len(ts) == nums[2]if sum([e[0] * e[1] for e in ts]) != pw * ph: print('Not possible!')else: def Solve(*, it = 0, p = None): if p is None: p = [[0] * pw for i in range(ph)] if it >= len(ts): for e0 in p: for e1 in e0: print(e1, end = ' ') print() return True for tw, th in [(ts[it][0], ts[it][1]), (ts[it][1], ts[it][0])]: zw = [0] * tw ow = [it + 1] * tw for i in range(ph - th + 1): for j in range(pw - tw + 1): if all(p[k][j : j + tw] == zw for k in range(i, i + th)): for k in range(i, i + th): p[k][j : j + tw] = ow if Solve(it = it + 1, p = p): return True for k in range(i, i + th): p[k][j : j + tw] = zw return False if not Solve(): print('Not possible!')
示例输入:
4 332 31 22 2
输出:
1 1 2 21 1 3 31 1 3 3