0
-(BOOL)isInArray:(CGPoint)point{
    if ([valid count]==0) {
        return NO;
    }

    for (NSValue *value in valid) {
        CGPoint er=[value CGPointValue];

        if( CGPointEqualToPoint(point,er)) return NO;
    }
    return YES;
}



-(void)check:(CGPoint)next{

if (!next.y==0) {

    int ics=(int) next.x;
    int igrec=(int)next.y;

    if (mat[ics][igrec]==mat[ics-1][igrec]){

        if (![self isInArray:next]) {
            [valid addObject:[NSValue valueWithCGPoint:next]];
            NSLog(@"valid y!=0 : %@",valid);

            [self check:CGPointMake(ics-1, igrec)];
        }
    }
}

}

y 是列,x 是行,mat 是 C 矩阵

我在这里尝试做的是:我next在矩阵中得到一个点, mat(我将使用 struct,但对于测试范围,我使用 CGPoint ..它基本上是同一件事),对于这一点,我检查它是否在第一行,如果不是,我检查值是否等于上面行的值。如果是,我将点的坐标添加到数组中并移动到上面的值(递归)。我也有左、右和下方的 ifs ......但想法是一样的。

我的问题:

  • 出于某种原因,它不能正常工作,即使垫子上满是 1 值
  • 我用来存储点的 NSMutableArray 始终为空(请注意,NSLog 被调用,因此它应该已经添加了一个对象)
    • 递归是否适用于方法?
    • 如果你有更好的想法如何做到这一点......我在听
4

1 回答 1

2

“有效”数组为零,因为您尚未分配它。(你可以向 nil 指针发送一个 addObject: 消息或任何消息——它只是不做任何事情。)确保你有

valid = [[NSMutableArray alloc] init];

在您调用此代码之前的某个地方。

此外,“!next.y==0”是有问题的。它可能与 "next.y != 0" 相同,即使!== 的优先级更高,但我不能保证。这就是我现在发现的所有内容,而没有真正理解这段代码试图做什么..


哦,另一个快速说明:不要编写自己的 isInArray,只需使用 NSArray 的 containsObject:。然后检查方法的内部部分(第二个缩进)是

NSValue* pointVal = [NSValue valueWithCGPoint:next];

if ( ![valid containsObject:pointVal] )
{
    [valid addObject:next];
    [self check:CGPointMake(ics-1, igrec)];
}

或者,如果您不关心有效数组中点的顺序,您可以使用 NSMutableSet 而不必担心检查该点是否已经在集合中。

是的,方法中的递归很好。它们实际上与 C 函数相同,只是带有几个隐藏参数(自指针和方法名称)并通过调度函数调用。

于 2012-04-12T16:39:33.687 回答