2014-01-23 106 views
1

所以我的輸入應該是一個n×n個不超過每9個字符的單詞(N < = 20)矩陣。輸出應該是一個字符串句子,通過從左上角開始以順時針螺旋方式讀取矩陣形成。在一些幫助下,我設法讓它運作起來,儘管我完全理解正在發生的事情仍然有些麻煩。我絕對不知道如何以相反的方式做到這一點 - 從右下角開始逆時針旋轉。這是我的代碼到目前爲止:如何在C++中逆時針讀取char矩陣?

string s; 
    int hor = 0, vert = 0; 
    while (hor < n/2 && vert < n/2) 
    { 
     for (i = vert; i < n - vert; i++) 
      s = s + a[hor][i] + " "; 
     for (i = hor + 1; i < n - hor; i++) 
      s = s + a[i][n - vert - 1] + " "; 
     for (i = n - vert - 2; i >= vert; i--) 
      s = s + a[n - hor - 1][i] + " "; 
     for (i = n - hor - 2; i > hor; i--) 
      s = s + a[i][vert] + " "; 
     hor++; 
     vert++; 
    } 
    if (n % 2) 
     for (i = vert; i < n - vert; i++) 
      s = s + a[hor][i] + " "; 
    else 
     for (i = hor; i < n - hor; i++) 
      s = s + a[i][vert] + " "; 
    cout << s << endl; 

任何想法?還有沒有更簡單的方法來做到這一點?

回答

2
  1. 使用變量x和y爲你的位置,更容易追蹤的方式。
  2. 使用狀態變量來跟蹤你的方向。逆時針左,上,右,然後向下。
  3. 從每個位置添加一個單詞。
  4. 提前您的位置,直到碰到邊緣,然後改變方向。做四次(每個方向一次),然後增加一個邊緣計數器,代表螺旋的寬度。
  5. 當你完成了這個400次(20 * 20),你就完成了。

的代碼直接從該算法流動。 (注意,我沒有編譯這個,所以你必須自己檢查錯誤)。

int x = n - 1; // Start at right. 
int y = n - 1; // Start at bottom. 
int spiral = 0; // Track the edges already visited (spiral). 
int direction = 0; // 0=left, 1=up, 2=right, 3=down. You could also use an enum. 
string s; // String builder. 

for (int count = 0; count < 400; count++) { // One word per cell, 400 cells. 
    s = s + a[x][y] + " "; // Add the word. 
    if (direction == 0) { // Left 
    if (x > spiral) x--; // Check edge, advance if no edge. 
    else { y--; direction = 1; } // Change direction to up if edge is hit. 
    } else if (direction == 1) { // Up 
    if (y > spiral) y--; // Check edge, advance if no edge. 
    else { x++; direction = 2; } // Change direction to right if edge is hit. 
    } else if (direction == 2) { // Right 
    if (x < (n - 1) - spiral) x++; // Check edge, advance if no edge. 
    else { y++; direction = 3; spiral++; } // Change edge and direction to down.  
    } else if (direction == 3) { // Down 
    if (y < (n - 1) - spiral) y++; // Check edge, advance if no edge. 
    else { x--; direction = 0; } // Change direction to left if hit. 
    } 
} 
+0

謝謝!這真的很有用,而且更容易。我注意到了兩個錯誤。我固定的第一個 - 應該是[y] [x]。第二個,但是,我不能。螺旋整數有問題。不管我有多混亂(將「螺旋++」放在不同方向的「elses」上),它就無法工作。 3x3與螺旋++的方向正確和下來,但就是這樣。 – user3213110

+1

至於y/x的位置,它是基於您的原始代碼,我看不到您的數據,所以很好。至於另一方面,你是正確的,螺旋++是在錯誤的地方。將它移至正確方向的else子句可以解決問題。我修改了我的原始文章,以便您可以看到究竟在哪裏。 –

1

準每一個細胞(X,Y)具有距離和角度:

d(x,y) = max(abs(x - N/2), abs(y - N/2)) 
a(x,y) = atan2(y - N/2, x - N/2) + bias; 

然後數據第一基於距離下一個角上排序, - 訂單被很好地定義。 組合度量將使用例如d(x,y) * 1000 + (int)a(x,y);以一次執行排序。

(免責聲明 - 這是或多或少語言不可知的)

+0

就像這樣有趣,這不適用於正方形陣列,因爲到角落的距離比到邊緣的距離更遠。 –

+0

這就是爲什麼距離不是歐幾里德。 –

+0

絕對有趣 - 但方式太先進,並且可能是OP的錯誤。但是 - 如果這是我的問題,我會試着以這種方式嘗試,只是爲了好玩! –