我有一个网格NxN:
2 1
4 8
我想在这个网格中找到所有路径:
{2,1}
{2,1,8}
{2,1,8,4}
{1,8,4}
{1,8}
{8,4}
...
我的网格定义如下:
gridArray = [NSArray arrayWithObjects:
[NSArray arrayWithObjects:@"2", @"1", nil],
[NSArray arrayWithObjects:@"4", @"8", nil],nil];
我有一个对象片(一个数字):
@interface Piece : NSObject {
int numCol;
int numRow;
NSNumber * value;
int nbNeighborsPieces;
NSMutableArray *neighborsArray;
}
我能够计算出所有邻居的一块。
但是现在,我想计算一个给定作品的所有路径。然后为每件作品。使用对象路径:
@interface Path : NSObject {
NSMutableArray * arrayOfPiece;
int sum;
}
有点:
for(Piece * pieces in pieceArray) {
[self path:piece];
}
我想我必须使用递归方法,但我不知道如何。
答案 0 :(得分:0)
解决这个问题的算法会很慢;我会想到一些在O(n ^ n)范围内的地方。
您可以使用与Depth First Search类似的内容找到所有路径。
首先,我认为你应该改变你的存储方法。不是将项存储在数组数组中,而是根据Vertex的概念创建一个节点类。此节点类将表示最深层数组中的一个元素。每个节点都应该有一个数组,该数组将包含其他节点,这些节点是节点的邻居。它还应该具有您要存储的对象的id
类型。这样您就可以创建Directed Graph。它还可以让您更轻松地实现递归。
@interface Node : NSObject
{
id object;
NSMutableArray * neighbours;
}
就算法来说,这就是我要开始的,我相信有些修改可以让它更快。
首先创建一个数组来保存路径,然后创建一个数组来表示路径。
NSMutableArray *paths;
NSMutableArray *currentPath;
在Node类中添加将执行递归的方法
- (void)findAllPathsExtending:(NSMutableArray *)path filling:(NSMutableArray *)paths
{
if ( [path containsObject:self] )
{
return;
}
[path addObject:self];
[paths addObject:[path copy]];
for (Node *aNode in neighbours)
{
[aNode findAllPathsExtending:path filling:paths];
}
[path removeObject:self];
return;
}
但仅凭这一点并不会给你所有的路径。您仍然需要为图中的每个节点预先形成此算法。正如我之前提到的,当你增加数组的大小时,这个任务变得非常昂贵。
答案 1 :(得分:0)
我在考虑Dijkstra算法http://en.wikipedia.org/wiki/Dijkstra's_algorithm,或A* search algo http://en.wikipedia.org/wiki/A*_search_algorithm。它们都是路径追踪者。 Generaly Dijkstra稍慢(更多计算)但更容易实现。 Dijkstra是递归的,不确定A *搜索,因为我从未实现过。如果你有小网格,Dijkstra将真正适合你的需要。并且不仅会计算您的路径,还会计算所有其他路径。我真的很喜欢它。