2017-02-01 6 views
1

Например, сетка 3x3.Как я могу пересекать сетку NxN циклически с помощью JavaScript?

[1] [2] [3]
[4] [5] [6]
[7] [8] [9]

мне нужно пройти через сетку в циклической форме и выводить каждый номер, где был путь.

вход для 3х3 является многомерный массив:

input = [ 
[1, 2, 3], 
[4, 5, 6], 
[7, 8, 9] 
] 

Для 3х3 вывод должен быть массивом или строкой.

output = [1, 2, 3, 6, 9, 8, 7, 4, 5] 

Решение также необходимо масштабировать до любого сетки NxN.

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

+1

Вы сделали какие-либо исследования на всех? Взгляните на http://stackoverflow.com/questions/398299/looping-in-a-spiral и один из упомянутых в нем скриптов: http://jsfiddle.net/davidonet/HJQ4g/ – Snowmonkey

+0

Я думаю, что спираль была словом Я искал для поиска. Было бы неплохо, если бы решение можно было объяснить проще. – Millicano

+2

Поиск google для 'nxn grid spiral algorithm javascript' - не найдет много javascript, но некоторые из них очень хорошо объяснены. Например, https://algorithmstuff.wordpress.com/2013/10/13/print-a-matrix-in-spiral-order/ – Snowmonkey

ответ

0

Here is the fiddle code

Смотрите рисунок.

Если вы ограничиваетесь массивом или предыдущей позицией, вам нужно либо уменьшить/увеличить переменную столбца, либо переменную строки.

Шаблон для циклического зацикливания

  1. увеличения столбец переменного (к)
  2. увеличения строки переменного (я)
  3. переменного уменьшение столбца (J)
  4. уменьшения строки переменного (я)
  5. увеличить переменную столбца (j)
  6. увеличить переменную строки (i) .... ....

Вот мой код

//input array 
var input = [[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]] 

//get the no of rows 
var noOfRows = input.length 

//get the no of cols 
var noOfCols = input[0].length 

//initialize i and j to 0 
var i =0, j = 0; 

//first we go by increasing var j 
var status = "increasingJ"; 

//output array initalize to empty array 
var output = [] 

//till output is no equal to 9, loop through 
while(output.length != noOfCols * noOfRows){ 

    if(status == "increasingI"){ 

     if(input[i] == undefined || input[i][j] == null){ 
      i--; 
      j--; 
      status = "decreasingJ";  
     }else{ 
      output.push(input[i][j]); 
      input[i][j] = null; 
      i++; 
     } 
    } 
    if(status == "increasingJ"){ 
     if(input[j] == undefined || input[i][j] == null){ 

      j--; 
      i++; 
      status = "increasingI";  
     }else{ 
      output.push(input[i][j]); 
      input[i][j] = null; 
      j++; 
     } 
    } 
    if(status == "decreasingI"){ 
     if(input[i] == undefined || input[i][j] == null){ 
      i++; 
      j++; 
      status = "increasingJ";   
     }else{ 
      output.push(input[i][j]); 
      input[i][j] = null; 
      i--; 
     } 
    } 
    if(status == "decreasingJ"){ 
     if(input[j] == undefined || input[i][j] == null){ 
      j++; 
      i--;  
      status = "decreasingI";   
     }else{ 
      output.push(input[i][j]); 
      input[i][j] = null; 
      j--; 
     } 
    } 
} 
1

Вот возможное решение с помощью некоторых рекурсии:

function traverseSpiral(n, level=0) { 
    //USE A CURSOR TO TRAVERSE THE OUTERMOST LOOP FOR n 
    var x=0; 
    var y=0; 
    //TOP 
    while (x<n) { 
    output.push(input[level+y][level+x]); 
    x++; 
    } 
    x--; 
    y++; 
    //RIGHT 
    while (y<n) { 
    output.push(input[level+y][level+x]); 
    y++; 
    } 
    y--; 
    x--; 
    //BOTTOM 
    while (x>=0) { 
    output.push(input[level+y][level+x]); 
    x--; 
    } 
    x++; 
    y--; 
    //LEFT 
    while (y>0) { 
    output.push(input[level+y][level+x]); 
    y--; 
    } 
    y++; 
    //WE COMPLETED THE LOOP. NOW WE WE ARE LEFT WITH A GRID OF (N-2)x(N-2) 
    n = n - 2; 
    if (n>1) { 
    //TRAVERSE THE NEXT LEVEL INNER LOOP 
    return traverseSpiral(n,level+1); 
    } else if (n==1) { 
    //IF N=1 THEN THERE IS ONE SPACE LEFT. JUST GET THAT LAST SPACE AND WE'RE DONE. 
    output.push(input[y][x+1]); 
    return output; 
    } else { 
    //IF N=0 THEN WE ARE DONE. 
    return output; 
    } 
} 

Рабочие образцы:

4x4 https://jsfiddle.net/mspinks/4gaskn8o/19/

3x3 https://jsfiddle.net/mspinks/4gaskn8o/21/

Примечание: это работает для NxN, как указано. Он не работает для NxM.

+0

Спасибо. Сможете ли вы сломать его и объяснить? Я хотел бы знать, что я могу сделать, чтобы улучшить мою способность решать эти проблемы. – Millicano

+1

Речь идет о том, чтобы разбить эти проблемы на более мелкие проблемы. В случае этой спирали вы повторяете шаблон снова и снова (начинайте сверху, опускайте правую сторону, переходите и создавайте левую сторону). Если вы завершили этот процесс на самом удаленном «цикле», вы останетесь с меньшей матрицей ((N-2) x (N-2)). Итак, вы делаете то же самое с N-2. Продолжайте делать это до тех пор, пока N = 1 или N = 0. –

+0

В основном мое решение использует курсор, который пересекает самый внешний цикл. Затем начинается рекурсия, и процесс повторяется в следующем внутреннем цикле. Рекурсия продолжается на более глубоких циклах до N = 1 или N = 0. Если N = 1, то N начинается как нечетное число, и в середине остается одно пространство. Получите это дополнительное пространство, и мы закончили. Если N = 0, то N началось как четное число, и мы закончили. –