2016-03-23 13 views
0

私はこのように頭の中に描いている2次元配列(大きさはn = 5)を持っています(各ボックスは配列の要素です) ):2D配列を循環させる方法

http://tr1.cbsistatic.com/hub/i/2015/05/07/b1ff8c33-f492-11e4-940f-14feb5cc3d2a/12039.jpg)このイメージに

、nは3である。すなわち、nは列の数であり、5は私のアレイ内の行の数です。

最も左の列のセルから最も右の列のセルまでのすべてのパスを反復(つまり、歩く)し、その間の各列から1つのセルを選択する効率的な方法を探したいと思います。

nは実行時にのみ決定されるため、n個のネストされたループで単純に解決することはできません。

これは、再帰が最善の方法であると考えていますが、理論的にどのように開始するかを描写できないと思います。

すべてのパスを循環する方法についていくつかのアドバイスを提供できますか?それは十分に簡単だと私は間違って何を言っていることはできません。どんなコードもなく理論的な説明だけでも非常に高く評価されます。

私はC#、Visual Studioでコーディングしています。 http://www.introprogramming.info/english-intro-csharp-book/read-online/chapter-10-recursion/#_Toc362296468

static void NestedLoops(int currentLoop) 
{ 
if (currentLoop == numberOfLoops) 
{ 
    return; 
} 

for (int counter=1; counter<=numberOfIterations; counter++) 
{ 
    loops[currentLoop] = counter; 
    NestedLoops(currentLoop + 1); 
} 
} 
+1

この問題を自分で解決するための試みを行ってください。 – Nate

+0

*「最も左の列のセルから最も右の列のセルまで、各列のセルを1つ選択するすべてのパスを反復する(つまり、歩く)効率的な方法を探したい」* *それよりはるかに優れたルールを定義する必要があります。私がセル 'm、n 'に入っていれば、どのセルを列' n + 1'に入れることができますか? –

+0

1.左端の列からy0に任意のx座標を入力します。2.セル(x、y)内にある場合、x座標(x + 1)のセルに移動することはできますが、任意のy座標3.すべてのx座標の右端の列ynで終わらなければならない – projectprogrammer

答えて

0

から以下のコードを使用して解決::

UPDATEはこの階乗問題でありますので、メモリや値の制限の問題に非常に迅速に実行することがあります。

Diegoによってthis SO postのコードが使用されました。

class Program 
{ 
    static void Main(string[] args) 
    { 
     int n = 5; 
     int r = 5; 
     var combinations = Math.Pow(r, n); 
     var list = new List<string>(); 
     for (Int64 i = 1; i < combinations; i++) 
     { 
      var s = LongToBase(i); 
      var fill = n - s.Length; 
      list.Add(new String('0', fill) + s); 
     } 

     // list contains all your paths now 

     Console.ReadKey(); 
    } 

    private static readonly char[] BaseChars = "".ToCharArray(); 
    public static string LongToBase(long value) 
    { 
     long targetBase = BaseChars.Length; 
     char[] buffer = new char[Math.Max((int)Math.Ceiling(Math.Log(value + 1, targetBase)), 1)]; 
     var i = (long)buffer.Length; 
     do 
     { 
      buffer[--i] = BaseChars[value % targetBase]; 
      value = value/targetBase; 
     } 
     while (value > 0); 
     return new string(buffer); 
    } 
} 

リストには、パスを検出するために使用できるベース5で表される数値のリストが含まれます。例えば、「00123」は第1のセル、次いで第1のセル、次に第2のセル、次に第3のセルおよび第4の最終セルを意味する。

0

解決済み:上の編集された質問に掲載されたコードと再帰チュートリアルへのリンクを参照してください。ここで、N個のネストされた反復ループをシミュレートするために再帰を使用します。

関連する問題