Python(AI 约束满足问题)将正方形 and/or 矩形 (2d) 瓷砖安装到矩形地面上
Python(AI Constraint satisfaction problem) Fitting square and/or rectangular (2d) tiles onto a rectangular ground
我必须使用 python 程序通过 AI 算法将 and/or 二维瓷砖放入二维正方形或矩形平面中。每个图块都有长度和宽度。例如,如果一个平面是 4x3 并且一组图块是
S={(2,3),(1,2),(2,2)}
这些图块可以旋转 90 度以适应矩阵。
输入
第一行包含平面的长度和宽度
第二行瓷砖数量
然后是后续瓷砖的长度,宽度
但输入应该用制表符分隔
例如
4 3
3
2 3
1 2
2 2
输出
例如
1 1 2 2
1 1 3 3
1 1 3 3
我无法解决这个问题,因为我只能在 python 中使用标准库,没有 NumPy 也没有 CSP 库
~编辑 2`
到目前为止我的代码我不知道如何在没有 csp 库的情况下添加算法或生成网格
from sys import stdin
a = 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])
我已经使用 backtracking 方法解决了任务,没有任何 non-standard 模块。
import sys
nums = 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 3
3
2 3
1 2
2 2
输出:
1 1 2 2
1 1 3 3
1 1 3 3
我必须使用 python 程序通过 AI 算法将 and/or 二维瓷砖放入二维正方形或矩形平面中。每个图块都有长度和宽度。例如,如果一个平面是 4x3 并且一组图块是
S={(2,3),(1,2),(2,2)}
这些图块可以旋转 90 度以适应矩阵。
输入 第一行包含平面的长度和宽度 第二行瓷砖数量 然后是后续瓷砖的长度,宽度
但输入应该用制表符分隔
例如
4 3
3
2 3
1 2
2 2
输出 例如
1 1 2 2
1 1 3 3
1 1 3 3
我无法解决这个问题,因为我只能在 python 中使用标准库,没有 NumPy 也没有 CSP 库
~编辑 2` 到目前为止我的代码我不知道如何在没有 csp 库的情况下添加算法或生成网格
from sys import stdin
a = 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])
我已经使用 backtracking 方法解决了任务,没有任何 non-standard 模块。
import sys
nums = 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 3
3
2 3
1 2
2 2
输出:
1 1 2 2
1 1 3 3
1 1 3 3