2013-01-11 29 views
0

可能重複:
Looping in a spiral
Writing a string in a spiral
Print two-dimensional array in spiral order
2d Array in Spiral Order如何在一維數組中執行螺旋順序遍歷?

我們在矩陣形式的數據

0 0 0 0 0 
0 1 2 3 0 
0 4 5 6 0 
0 7 8 9 0 
0 0 0 0 0 

其被存儲在一維陣列中的這種方式

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

這是一個零填充3×3陣列轉化成5×5。我們知道起始索引和結束索引。我們可以看到,我們可以執行25個操作並打印所有值,但是如果我們按照螺旋順序進行操作,理想情況下我們應該只在9個操作中執行此操作。

有誰知道如何做到這一點?

我們知道行數和列數。這裏是rows = 5 cols = 5。

因此開始索引將是行+ 1和結束索引將是行×COLS -6-

我可視它作爲一個螺旋順序遍歷。

+4

你是指什麼螺旋順序?你有一個1D陣列嗎? – Woot4Moo

+2

什麼是開始指數和結束指數?通過當前的例子走過我們。 – Srinivas

+0

它是一個1d陣列,將解決方案顯示爲螺旋順序,起始索引爲6,結束索引爲18. – gizgok

回答

0

鑑於你5x5矩陣假設您知道該行的索引零指數的基礎是:
0,1,2,3,4
5,6,7,8,9
10,11,12,13,14
15,16,17,18,19
20,21,22,23,24

你知道你的第一個指標是6,最後是18。因此,作爲一個起點,你知道你可以消除以下矩陣件:

0,1,2,3,4

19,20,21,22,23,24,25

這算作2操作。

你也知道,因爲你從索引6開始,這是一個3x3你只需要去索引8,這是一個操作。

然後需要添加5到以前的6指數這會產生11和(共2操作)再次進行當前操作計數是5

11再次做到這一點,你會得到16一個操作。獲得2個更多的操作,最後以18結束。目前共有8項行動。

0

我會做這樣的事情:

POINT ul = (start_idx/width, start_idx%width); 
    POINT br = (end_idx/width, end_idx%width); 
    POINT p = ul 
    dir = RIGHT; 
    while (ul != br) 
    visit(ARRAY[p.x+p.y*WIDTH]) 
    case dir 
     when RIGHT: 
      p.x+=1 
      if (p.x==br.x) 
      dir = DOWN 
      ul.y++; 
     when DOWN 
      p.y+=1 
      if (p.y==br.y) 
      dir = LEFT 
      br.x--; 
     when LEFT: 
      //like RIGHT but -1 and adjust br.y upwards when done 
     when UP: 
      //like DOWN but -1 and adjust ul.x rightward when done 
    endwhile 

的想法是跟蹤虛擬x和y的訪問。將點移動到由開始點和結束點定義的框的邊上。在完成訪問時向內調整邊。