2012-04-12 33 views
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)]; 
     } 
    } 
} 

}再帰、アルゴリズムおよびNSValue問題

のy列、xは、行されている、マットは、私がここで何をしようとしているC行列

であるが、これは次のとおりです。私は取得します私はそれが最初の行にあるかどうかを確認し、それがiでない場合はチェックします(私は構造体を使用しますが、テストの範囲はCGPoint.itの基本的なものと同じです)。値が上記の行の値と等しいかどうかをチェックします。そうであれば、ポイントの座標を配列に追加し、上の値に(再帰的に)移動します。私は左、右、下にもifを持っていますが、アイデアは同じです。

私の問題:それも1つの値

  • NSMutableArrayの私はポイントを保存するために使用の完全なマットで、それが必要として動作しないいくつかの理由について

    • がnull(注常にあることNSLogが呼び出されて既にオブジェクトが追加されているはずです)
      • 再帰はメソッドで動作しますか?あなたがこれを行うにはどのように良いアイデアを持っている場合は
      • は...私はあなたがそれを割り当てられていないため、「有効」配列がnilである
  • 答えて

    2

    を聞いています。 (あなたはのaddObjectを送ることができます:NULLポインタへのメッセージ、または任意のメッセージを、 - それだけで何もしません。)あなたはこのコードを呼び出している前に、あなたはどこか

    valid = [[NSMutableArray alloc] init]; 
    

    を持っていることを確認してください。

    また、「!next.y == 0」は疑問です。たとえ、「next.y!= 0」と同じになることがあります。 ==より高い優先順位を持っていますが、それを保証するものではありません。代わりに、独自のisInArrayを書くだけNSArrayののcontainsObjectを使用:.:それはああ、別の簡単なメモが


    ..私は本当にこのコードがやろうとしているものgrokkingなくて、今のスポットすべてですあなたがあなたの代わりにしていないNSMutableSetを使用するかどうかのチェックを心配することができ、有効な配列内のポイントの順序を気にしない場合は、チェック方法(第2インデント)の内側の部分は、その後、

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

    ですか、ポイントはすでにコレクションに入っています。

    はい、メソッドの再帰は問題ありません。実際にはC関数と同じですが、隠れ引数(セルフ・ポインタとメソッド名)を2つ持ち、ディスパッチ関数から呼び出されます。

    +0

    まあNSSetを使用しています。いくつかのものを動かしました。それは動作しますが、それはうまくいきません。私はそれを修正しようとしますが、うまくいけば、ここでコードを...おそらくあなたが私をいくつかより助けることができます:) – skytz

    +0

    私は '[自己チェック:CGPointMake(ics-1、igrec)];' ...任意のアイデアを呼び出さないと結論づけましたか? (もしそうなら、それは再帰的には働かない) – skytz

    +0

    それは自分のミスであるように見えますが、小さなものですが、今は完璧に働いています。ありがとうございます – skytz

    関連する問題