Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在objective-C中查找NxN网格中所有路径的算法_Objective C_Algorithm - Fatal编程技术网

在objective-C中查找NxN网格中所有路径的算法

在objective-C中查找NxN网格中所有路径的算法,objective-c,algorithm,Objective C,Algorithm,我有一个网格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]; 我有一个物件(一个数字

我有一个网格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 Path : NSObject {

NSMutableArray * arrayOfPiece;
int sum;
}
种类:

for(Piece * pieces in pieceArray) {
[self path:piece];
}

我想我必须使用递归方法,但我不知道如何使用。

解决这个问题的算法会非常慢;我会想一些在O(n^n)范围内的地方

您可以使用类似于的方法找到所有路径

首先,我认为您应该改变存储方式。不要将项存储在数组的数组中,而是基于数组的概念创建一个节点类。这个节点类将代表数组中的一个元素。每个节点都应该有一个数组,该数组将包含与该节点相邻的其他节点。对于要存储的对象,它还应该具有
id
类型。这将允许您创建一个。它还允许您更容易地实现递归

@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; 
}

但单凭这一点并不能给你所有的道路。您仍然需要为图中的每个节点执行此算法。正如我前面提到的,随着阵列大小的增加,这项任务很快就会变得非常昂贵。

我想到的是Dijkstra算法的_算法,或者。他们都是开拓者。一般来说,Dijkstra稍微慢一点(计算量更多),但更容易实现。Dijkstra是递归的,不确定*搜索,因为我从未实现过。如果你有小网格,Dijkstra将真正满足你的需要。不仅会计算你的路径,还会计算所有其他路径。我真的很喜欢它。

您的示例清楚地说明了2x2网格的路径是什么,但不清楚如何使用NxN。路径是否总是在矩阵的周长上?还有,逆时针方向的路径呢?
- (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; 
}