2016-03-23 7 views
0

У меня есть 2-мерный массив (с размерами размеров n на 5), который я представляю себе в голове (каждый из них является элементом массива):Как циклически перемещаться по 2D-матрице (n на 12)

(http://tr1.cbsistatic.com/hub/i/2015/05/07/b1ff8c33-f492-11e4-940f-14feb5cc3d2a/12039.jpg)

В этом изображении, п равно 3. Т.е., п число столбцов, 5 число строк в моем массиве.

Я хочу найти эффективный способ итерации (например, пешком) по каждому пути, ведущему из любой ячейки в самом левом столбце, в любую ячейку в самом правом столбце, выбирая по одной ячейке из каждого столбца между ними.

Невозможно просто решить n вложенных циклов, так как n определяется только во время выполнения.

Я думаю, что это означает, что рекурсия, вероятно, лучший путь вперед, но не может представить, как начать теоретически.

Можете ли вы предложить несколько советов о том, как проходить по каждому пути. Это кажется достаточно простым, и я не могу сказать, что я делаю неправильно. Даже очень просто теоретическое объяснение без какого-либо кода будет очень оценено.

Я кодирую в C#, Visual Studio в случае, если это помогает.

UPDATE :: решен с помощью кода ниже от 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

* «Я хочу найти эффективный способ итерации (т. Е. Ходьбы) по каждому пути, ведущему из любой ячейки в самом левом столбце, в любую ячейку в правом столбце, выбрав одну ячейку из каждого столбца между ними.» * нужно определить правила намного лучше, чем это. Если я нахожусь в ячейке 'm, n', в какие ячейки я могу перейти в столбец' n + 1'? –

+0

1. Вы начинаете в крайнем левом столбце y0 с любой координатой x 2. Если вы находитесь в ячейке (x, y), вы можете перемещаться только в ячейку с x-координатой (x + 1), но с любой координатой y 3. вы должны заканчиваться в правой колонке, yn, с любой координатой x – projectprogrammer

ответ

0

Это факторная проблема, и поэтому вы можете запустить довольно быстро в пределах памяти вопросы или значения.

Получил код от this SO post от Diego.

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» означает первую ячейку, затем первую ячейку, затем вторую ячейку, затем третью ячейку и финальную четвертую ячейку.

0

Устранено: см. Код, отправленный в отредактированном вопросе выше, и ссылку на учебник по рекурсии, где вам понадобится рекурсия для имитации N вложенных итеративных циклов.

Смежные вопросы