簡體   English   中英

檢查二維數組中相鄰正方形的值

[英]Check value of neighbouring squares in 2D array

我正在創建帶有2D陣列的簡單掃雷板。 我想用相應的數字填充“炸彈”周圍的正方形。 我不必擔心我創建的董事會是否可以解決。 (這里不重要)

我的問題是:如何在不列出所有可能性的情況下優雅地填充數字?

我現在想出的是一個龐大的嵌套if語句,用於檢查鄰居是否

 -Inside bounds of array
 -Is it a bomb
 -Is it empty
 -Is it already a number

它看起來很長,而且硬編碼。

有沒有簡單優雅的方法來檢查2D矩陣中鄰居的值?

我意識到在SO語言中用Python語言詢問也存在類似的問題,那里的解決方案非常“ pythonic”。 我正在通過在簡單的2D數組上使用簡單的結構(例如循環,if語句等)來尋找一種簡單的方法。

試想一下,如果這項任務交給了一位編程新學生,那么他們只了解if語句和循環等基礎知識。 因此,應避免使用lambda,遞歸,迭代器等建議的解決方案。

檢查鄰居時,復雜性的主要原因是邊界。 例如,如果您在第一行的單元格中,則不想檢查上面的三個鄰居,因為它們將位於數組之外。

有幾種消除邊界檢查的常用方法。 假設您有一個帶有此類接口的類:

class Board {
  public:
    bool IsBomb(int row, int col) const;
    int GetCount(int row, int col) const;
    ...
};

您可以在IsBomb方法的實現中隱藏邊界檢查。 例如,如果您使用IsBomb之外的坐標來調用IsBomb ,則它應返回false而不是實際在數組(或任何存儲機制)中查找。 現在, GetCount可以簡單地為所有八個鄰居調用IsBomb,而不必擔心這些鄰居中的任何一個是否不在游戲場的邊緣。 這是數據抽象方法。

另一種方法是使電路板的所有面都更大,但僅通過內部正方形循環。 然后,您無需檢查相鄰的正方形是否在范圍內。 這將是您隱藏在Board方法中的實現細節。 它與第一種方法完全兼容。

還有其他一些技巧可以避免循環中的邊界檢查,例如將棋盤划分為九種特殊情況(拐角,邊緣和中間),但這對於像掃雷艇這樣的游戲來說實在是過大了。 而且它不會降低復雜性; 在某些極端情況下,這主要是為了提高性能。

for(int x =0; x<numRows; x++){
    for(int y = 0; y<numCols; y++){
        if(array[x][y] != "bomb"){
             array[x][y] = number
        }
    }
}

最好的方法就是循環遍歷每個索引並檢查是否有炸彈。 如果沒有,請添加一個數字。 第一個for循環遍歷每一行,然后第二個for循環遍歷每一列。 因此,您將檢查第1行與第1列,第2列,第3列等。然后,在第1行完成后,移至第2行,並與第1列,第2列等進行檢查,直到搜索了每個位置。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM