【问题标题】:Sliding Block Puzzle, how to approach this [closed]滑块拼图,如何解决这个问题[关闭]
【发布时间】:2015-09-30 16:26:23
【问题描述】:

我正在学习人工智能课程,我们分配的第一个问题是创建一个程序来解决滑动砖难题。

现在,我们的教授还没有给我们任何关于如何解决这个问题的信息。我是两个班级,我们所讨论的只是 AI 和代理的定义。

我完全不知道如何解决这个问题。我们得到了代表一块板的文本文件,我的代码已经设置为将板转换为二维数组,打印出来等等(简单的东西)。但现在我需要努力实际解决我一无所知的问题。

这是一个板的例子:

1,1,1,1,1,1,
1,3,2,2,4,1,
1,5,2,2,6,1,
1,7,7,8,8,1,
1,9,9,10,10,1,
1,0,0,0,0,1,
1,0,0,0,0,1,
1,1,-1,-1,1,1,

1 代表一堵墙

0代表空格

-1代表中奖区

2代表“特殊块”

任何greater than 2 都是“非特殊”块

有谁知道我可以使用什么算法来解决这个问题?或者可能是一个很好的资源。

以下是游戏本身的示例: http://www.mathplayground.com/slidingblock.html

【问题讨论】:

  • 你的教授会是一个很好的参考。你有安排与他们会面吗?就目前而言,您的问题对于 StackOverflow 来说太宽泛了。
  • @Trobbins 唯一让我退缩的是他表现得很严厉/自命不凡,我害怕被责骂为什么我不知道如何解决这个问题。跨度>
  • 这究竟是什么谜题?这不是 N 谜题
  • @harold 我包含了一个游戏示例的链接
  • 您可能需要查看path finding algorithms。您可以将您的状态表示为图中的一个节点,并将从可能的移动中获得的状态表示为子节点

标签: java algorithm search data-structures


【解决方案1】:

假设你将你的状态表示为

class State {
    int[][] a;
}

那么你应该实现以下功能

  • List<State> getNeighbors(State s) - 此函数应通过有效移动为您提供从s 获得的所有可能状态。你应该做的是找到所有片段并尝试将它们向上、向下、向左、向右翻译。

  • void solve(State s) - 这个函数应该通过使用一些标准算法 DFS、BFS、A* 等来解决这个难题。您可能还想在列表中跟踪您访问过的状态 List<State> visited 或在散列集HashSet<State> visisted 中更有效,但对于散列集,您必须实现散列函数。

请注意,您可以在 String 处表示状态,这将消除实现散列函数的必要性。

如果您不想在每个州搜索砖块,您可以将砖块表示为

class Brick {
    List<Point> points;
}

class Point {
    int x, y;
}

并且,或者,将状态表示为:

class State {
    int[][] a;
    List<Brick> bricks;
}

这样,找出所有可能的动作会更容易:

List<State> getNeighbors(State s) {
    List<State> neighbors = new ArrayList<State>();
    for (Brick b : s.bricks) {
         // if you can move the brick up
         // create new state new_state_up as you update 'a'
         // and 'bricks' and simply add it to neighbors.
         // do the same for the rest of the directions
    }
    return neighbors;
}

【讨论】:

  • 这很有帮助,我会看看我是否可以使用这些指南走上正确的轨道。不过有一件事,这就是我在上面的评论中提出的问题。我对如何处理两块长砖感到困惑。
  • @Brejuro 我希望这会有所帮助
  • 是的,非常感谢。我要开始工作了
【解决方案2】:

下一部分将是一个测试,它可以告诉你是否解决了它..

bool IsSolved( ... )

那么,也许您可​​以在任何时候想到合法的举动是什么?

移动 moveSet = GetValidMoves( ... )

这可能会引发如何处理这个问题?

【讨论】:

  • 我很困惑的是如何找到可能的动作?我知道有搜索算法,但有没有我应该关注的?
  • @Brejuro 你已经知道移动(如果它们占用的空间是空闲的,块可以向上/向右/向下/向左移动),搜索是链接移动以达到目标跨度>
  • @harold 我不确定如何处理两个空格长的块
  • @Brejuro 作为两个空格长的块;移动它同时移动它的两个“单元格”,因此两个目标单元格都必须是“空的或它自己”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-22
  • 2020-10-21
  • 2021-11-20
  • 2021-09-27
  • 1970-01-01
  • 1970-01-01
  • 2013-11-11
相关资源
最近更新 更多