我正在参加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
答案 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(...)
这可能会引发如何处理这个问题?