2016-12-13 46 views
-1

我創建一個命令行遊戲,其包括10×10陣列char,表示這樣的:如何在C++數組中連續「佔用」元素?

0 1 2 3 4 5 6 7 8 9 
0 . . . . . . . . . . 
1 . . . . . . . . . . 
2 . . . . . . . . . . 
3 . . . . . . . b . . 
4 . . A B C . 1 2 3 . 
5 . . . . . . . . . . 
6 . . . . . . . . . . 
7 . . . . . C c 3 . . 
8 . . . . . . . . . . 
9 . . . . . . . . . . 

.每個表示在板的未佔用點與字母和數字是其上已經件播放。上邊緣和左邊緣的數字僅供參考。

爲了計算點數並確保棋子在正確的位置播放,我想創建與剛剛播放的棋子相鄰的連續棋子的「子陣列」。從上面的示例中,如果B剛剛播放完畢,那麼該數組將包含A,BC

我很難找到這個連續的子陣列的「開始」(最左邊)和「結束」(最右邊)部分。一旦我有了這些,很容易解決。很明顯,我可以從棋盤的一端開始,然後將任何不是.的棋子添加到陣列中,但是最後我會看到該行中的所有棋子,而不僅僅是剛剛播放的棋子的旁邊的棋子。

我試過以下,但它仍然(由一個兩面關)打印輸出錯誤:

void Board::createHorizontalRun(int row, int column) { 
    int i = column; 
    int j = column; 

    while (array[row][i] != '.' && i >= 0 && i <= 9) { 
     i--; 
    } 
    while (array[row][j] != '.' && j >= 0 && j <= 9) { 
     j++; 
    } 
    cout << "run begins at " << i << endl; 
    cout << "run ends at " << j << endl; 
} 

我如何才能找到起點和相鄰的連續片的結束位置剛剛播放過的作品?

+1

這聽起來像你要找的顏色填充:https://en.wikipedia.org/wiki/Flood_fill。也就是說,除非你只是尋找水平或垂直運行一個網格單元格寬度,在這種情況下,問題更簡單。 – NPE

+7

拿出一張紙和一支筆。寫下來,用簡單的英語,簡而言之,邏輯句子,逐步實現你的算法的過程。 [在與你的橡皮鴨討論你提出的邏輯之後](https://en.wikipedia.org/wiki/Rubber_duck_debugging),只要你的橡皮鴨認同你的邏輯是正確的,只要把你寫下來的和直接的將其翻譯成代碼。任務完成。 –

+2

請注意您的代碼如何成功標識「第一個」。靠近你的跑步「,並且你知道開始位置從來不是''。 – Caleth

回答

0

這就是我想出了以下山姆的建議後:

vector<char> Board::getHorizontalRun(int row, int column) { 
    int runStart = column; 
    int runEnd = column; 
    vector<char> horizontalRun; 

    // find starting position of run 
    while (true) { 
     if (isInBounds(row, runStart - 1)) { 
      if (array[row][runStart - 1] == '.') { 
       break; 
      } else { 
       runStart--; 
      } 
     } else { 
      break; 
     } 
    } 

    // find ending position of array 
    while (true) { 
     if (isInBounds(row, runEnd + 1)) { 
      if (array[row][runEnd + 1] == '.') { 
       break; 
      } else { 
       runEnd++; 
      } 
     } else { 
      break; 
     } 
    } 

    // Use start and end positions to populate vector 
    for (int i = runStart; i <= runEnd; i++) { 
     horizontalRun.push_back(array[row][i]); 
    } 

    return horizontalRun; 
} 
相關問題