滑块拼图,如何处理这个问题

时间:2015-09-30 16:26:24

标签: java algorithm search data-structures

我正在参加AI课程,我们分配的第一个问题是创建一个程序来解决滑动拼图。

现在,我们的教授还没有向我们提供有关如何处理此问题的任何信息。我是两个班,我们所涉及的是AI和Agent的定义。

我完全迷失了如何解决这个问题。我们给出了代表电路板的文本文件,我的代码已经设置为将电路板转换为2d数组,打印出来等等(简单的东西)。但现在我需要努力实际解决它,我无能为力。

以下是董事会的一个例子:

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

2 个答案:

答案 0 :(得分:1)

假设您将州表示为

class State {
    int[][] a;
}

然后你应该实现以下功能

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

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

请注意,您可以表示HashSet<State> visisted处的状态,这将消除实现哈希函数的必要性。

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

String

,或者,将状态表示为:

class Brick {
    List<Point> points;
}

class Point {
    int x, y;
}

通过这种方式,所有可能的动作的发现将更容易:

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

答案 1 :(得分:0)

接下来的部分,将是一个可以告诉你是否已经解决它的测试..

bool IsSolved(...)

那么,也许你可以在任何时候思考法律行动是什么?

移动moveSet = GetValidMoves(...)

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