2017-01-10 11 views
0

私はこの場所にいなくなりました。問題はこれのようになります。 n x n配列が与えられた場合、最も外側の要素から中央の要素に配列された配列要素を時計回りに移動して返します。Snail Sort - 途中でくっついて、どうやって進めるのかわからない

array = [[1,2,3], 
     [4,5,6], 
     [7,8,9]] 
snail(array) #=> [1,2,3,6,9,8,7,4,5] 

より良く理解するために、連続して次のアレイの番号に従ってください。

array = [[1,2,3], 
     [8,9,4], 
     [7,6,5]] 
snail(array) #=> [1,2,3,4,5,6,7,8,9] 

このイメージをより明確に物事を説明します:

私が持っている試みをこれまでのところ:

arr = [[1, 2, 3], [3, 4]]; 
var n = arr[0].length; 
var i = 0, j = 0; 
var fa = []; 
var count = 0; 
var direction = "right"; 
console.log(n); 
while (fa.length < n * n) { 
    fa.push(`${i}, ${j}`); 
    if (j == n - 1 && i < n - 1) { 
     direction = "down"; 
    } else if (j == 0 && i != 0) { 
     direction = "up"; 
    } else if (i == n - 1) { 
     direction = "left"; 
    } else if (i == 0) { 
     direction = "right"; 
    } 
    switch (direction) { 
     case "right": 
      j++; 
      break; 
     case "left": 
      j--; 
      break; 
     case "up": 
      i--; 
      break; 
     case "down": 
      i++; 
      break; 
    } 
    if (count++ == 15) 
     break; 
} 
console.log(fa); 

私はどのように進めるのかよくわかりません。私は2つのことを知る必要があります。

  1. ここからどのように進む必要がありますか?
  2. 私が作っている間違いは何ですか?
+0

あなたはあなたのコードから取得された出力を記述/表示する必要がありますので、私たちが間違っているかのアイデアを持っている... –

+0

あなたが方向を変えるたびに、あなたは削除/あなただけの完成行/列を避ける必要があります。これは再帰的に非常にうまくいくでしょう。 – nurdyguy

+0

@ SunilD。ボス、私は完全なコードを与えました、他に何を期待していますか?あなたのための指示:http://i.imgur.com/nc29mXa.png –

答えて

1

ここで私はこの問題を解決しました。私が行っているように、最小値と最大値と行値をどのように追跡しているかを見ることができます。私はあなたのコードでそれをやっている方法を正確には分かりませんが、うまくいけば、これは役に立ちます。

var m = 4; 
var n = 4; 
var board = [ 
    [1, 2, 3, 4], 
    [5, 6, 7, 8], 
    [9, 10, 11, 12], 
    [13, 14, 15, 16] 
]; 

var result = []; 
var dir = 'right'; 
var imin = 0; 
var imax = m - 1; 
var jmin = 0; 
var jmax = n - 1 

var i = imin; 
var j = jmin; 
var done = false; 

while (!done) 
{ 

    switch (dir) 
    { 
     case 'right':     
      i = imin; 
      j = jmin; 
      for (j; j <= jmax; j++) 
       result.push(board[i][j]); 
      console.log(result); 
      dir = 'down'; 
      imin++; 
      break; 
     case 'left': 
      i = imax; 
      j = jmax;     
      for (j; j >= jmin; j--) 
       result.push(board[i][j]); 
      console.log(result); 
      dir = 'up'; 
      imax--; 
      break; 
     case 'down': 
      i = imin; 
      j = jmax; 
      for (i; i <= imax; i++) 
       result.push(board[i][j]); 
      console.log(result); 
      dir = 'left'; 
      jmax--; 
      break; 
     case 'up': 
      i = imax; 
      j = jmin; 
      for (i; i >= imin; i--) 
       result.push(board[i][j]); 
      console.log(result); 
      dir = 'right'; 
      jmin++; 
      break; 
    } 

    if (imin > imax || jmin > jmax) 
     done = true; 
} 

console.log(result); 
+0

うわー。これは完璧のようです!ありがとう!私は同じことをした、私はしませんでしたか?どこで私は間違えましたか? –

+0

私があなたのことを伝えることができるのは、基本的には周りの周りを回るつもりです。一度あなたがあなたがそれを追い続けないようにその側を削除する必要がある側を完了します。私は 'imax'' imin''jmax'と' jmin'を設定してこれを行いました。 – nurdyguy

関連する問題