在网格上移动 L 形部件

moving an L-shaped piece on a grid

提问人:m4l4 提问时间:2/9/2020 最后编辑:m4l4 更新时间:2/9/2020 访问量:260

问:

我正在尝试编写一个小网格游戏,但我在编码棋子移动时遇到了问题。

我有一个小的 4x4 rgb 像素网格,初始化为 np.zeros(4,4,3),全黑。用于刷新对象位置和空闲单元格的更新方法、重置方法以及使用 cv2 显示像素矩阵中的网格的简单 show 函数。

class Grid():
    def __init__(self):
        self.cells = np.zeros((SIZE, SIZE, 3), dtype=np.uint8)
        self.free_cells = []

    def update(self, c, l):
        self.reset()  #clear cells and free cells list

        self.cells[c.x][c.y] = COIN_COL  #set coin position

        for i in range(len(l.coords)):   #set L posiion
                self.cells[l.coords[i][0]][l.coords[i][1]] = L_COL

        for i in range(len(self.cells)):  #calculate free cells
            for j in range(len(self.cells)):
                if np.amax(self.cells[i][j]) == 0:
                    self.free_cells.append((i, j))

    def reset(self):
        self.cells = np.zeros((SIZE, SIZE, 3), dtype=np.uint8)
        self.free_cells = []

    def show(self):
        img = Image.fromarray(self.cells, "RGB")
        img = img.resize((200,200))

        cv2.imshow('img', np.array(img))
        cv2.waitKey(0)

网格上有 2 件,一个 L 形的 3x2 和一枚 1x1 的硬币。 它们都有颜色和坐标

SIZE = 4
COIN_COL = (255,255,255)
L_COL = (0,0,255)
C_COORDS = np.array((0,0), dtype=np.uint8)  #coin starting position
L_COORDS = np.array(((1,1),(2,1),(3,1),(3,2)), dtype=np.uint8) #L starting position

class Coin():
    def __init__(self, coords):
        self.x = coords[0]
        self.y = coords[1]

class LShape():
    def __init__(self, coords):
        self.coords = coords

每个棋子都可以随时旋转、平移和移动,只要它停留在网格内,并且不与其他棋子重叠。

移动硬币很简单:检查空单元格,选择一个,更新硬币坐标,更新网格。

移动 L,看起来并不那么简单。我怎样才能检查这件作品的每一个可能的法律动作?(网格上可能有 1 个以上的硬币)。我首先计算空单元格,这样我就有了自由空间的布局,我试图想出一种算法来突出合法移动,首先删除孤立的自由单元格 (1x1),然后删除孤立的对 (2x1),依此类推,但我中途卡住了。

我还考虑在空网格上列出每个可能的位置,如果它们需要占用的单元格,则从列表中删除位置,但这似乎既不优雅也不理想。

关于如何解决这个问题的任何想法?

算法 优化 语言无关 的位置

评论

0赞 Guy Coder 2/9/2020
你为什么不先尝试用与标签语言无关的问题来回答然后自己编写代码。然后,如果您对此有疑问,可以使用标签 python-3 提出什么问题。
1赞 m4l4 2/9/2020
感谢您的建议,我想展示一些代码以更好地解决问题,但我认为你是对的
0赞 Guy Coder 2/10/2020
不是一个答案,而是一个想法,我很想知道回答这个问题的人是否也知道这一点。通常我喜欢在答案中寻找哈密顿循环,但这可能有循环分支的死胡同。由于我不知道这张图的名称,搜索并找到了无沉(有限)二元图。所以我想知道我的假设是否正确,以及我是否找到了正确的名字。
1赞 Guy Coder 2/10/2020
that doesn't seems elegant nor optimal.取决于计算完成的时间。如果数据是预先计算和存储的,那么你就简化了问题。然后,如果您找到一种方法来存储数据,以便可以轻松搜索数据,那么您又简化了问题。现在,如果你根据一枚硬币的药水连接所有有效位置,你会得到一个图表。现在,如果您知道如何在图形中从一个位置移动到下一个位置,那么您已经将问题转换为图形上的移动,从而为您提供 O(1) 解决方案。当然,如果我所有的想法都成立的话。

答: 暂无答案