簡體   English   中英

如何修復我的代碼並使它遍歷2D數組中的所有行? (C ++)

[英]How do I fix my code and make it iterate through all the rows in my 2D array? (C++)

我的代碼遍歷一個矩陣,該矩陣轉換為2D數組,但是當我嘗試根據某些規則更改值時,代碼永遠不會到達最后一行。 沒有錯誤,程序在到達最后一行之前就結束了。 可能是該數組在獲取相鄰單元格的計數時超出范圍,但是我認為會由此產生一條錯誤消息,並且我不確定為什么這行不通,我認為我已經if語句中的條件正確,但可能不正確。

我用來測試代碼的2D數組看起來像這樣(我認為這樣做可以縮短代碼,並更好地了解2D數組的使用方式和外觀)

0行:1000
第1行:0111
第2行:0010

以及

0行:1000
第1行:0111
第2行:0010
第3列:0100
第4行:0001

兩者總是會在到達最后一行之前停止。

下面是我的代碼,雖然有點多,但是我認為診斷問題是必要的。

getNeighbors函數基本上只查看行和列的位置並計算其周圍1的數量,每個單元最多具有8個鄰居(世界邊緣的單元會更少)。

int getNeighbors(int **Bacteria, int rows, int columns, int  row, int column) {

    int count = 0;


    if (row==0 && column==0) {

        if (Bacteria[row+1][column+1] == 1) {
            count++;
        }
        if (Bacteria[row][column+1] == 1) {
            count++;
        }
        if (Bacteria[row+1][column] == 1) {
            count++;
        }
        return count;
    } else if (row==rows && column==columns) {

        if (Bacteria[row-1][column-1] == 1) {
            count++;
        }
        if (Bacteria[row][column-1] == 1) {
            count++;
        }
        if (Bacteria[row-1][column] == 1) {
            count++;
        }
        return count;
    } else if (row==rows && column==0) {

        if (Bacteria[row-1][column+1] == 1) {
            count++;
        }
        if (Bacteria[row][column+1] == 1) {
            count++;
        }
        if (Bacteria[row-1][column] == 1) {
            count++;
        }
        return count;
    } else if (row==0 && column==columns) {
        if (Bacteria[row+1][column-1] == 1) {
            count++;
        }
        if (Bacteria[row][column-1] == 1) {
            count++;
        }
        if (Bacteria[row+1][column] == 1) {
            count++;
        }
        return count;
    } else if (row==0) {
        if (Bacteria[row+1][column+1] == 1) {
            count++;
        }
        if (Bacteria[row][column-1] == 1) {
            count++;
        }
        if (Bacteria[row][column+1] == 1) {
            count++;
        }
        if (Bacteria[row+1][column] == 1) {
            count++;
        }
        if (Bacteria[row+1][column-1] == 1) {
            count++;
        }
        return count;
    } else if (row==rows) {
        if (Bacteria[row-1][column+1] == 1) {
            count++;
        }
        if (Bacteria[row][column-1] == 1) {
            count++;
        }
        if (Bacteria[row][column+1] == 1) {
            count++;
        }
        if (Bacteria[row-1][column] == 1) {
            count++;
        }
        if (Bacteria[row-1][column-1] == 1) {
            count++;
        }
        return count;
    } else if (column==0) {
        if (Bacteria[row+1][column+1] == 1) {
            count++;
        }
        if (Bacteria[row][column+1] == 1) {
            count++;
        }
        if (Bacteria[row+1][column] == 1) {
            count++;
        }
        if (Bacteria[row-1][column] == 1) {
            count++;
        }
        if (Bacteria[row-1][column+1] == 1) {
            count++;
        }
        return count;

    } else if (column==columns) {
        if (Bacteria[row-1][column-1] == 1) {
            count++;
        }
        if (Bacteria[row][column-1] == 1) {
            count++;
        }
        if (Bacteria[row-1][column] == 1) {
            count++;
        }
        if (Bacteria[row+1][column] == 1) {
            count++;
        }
        if (Bacteria[row+1][column-1] == 1) {
            count++;
        }
        return count;
    } else {
        if (Bacteria[row-1][column+1] == 1) {
            count++;
        }
        if (Bacteria[row][column-1] == 1) {
            count++;
        }
        if (Bacteria[row][column+1] == 1) {
            count++;
        }
        if (Bacteria[row-1][column] == 1) {
            count++;
        }
        if (Bacteria[row+1][column] == 1) {
            count++;
        }
        if (Bacteria[row+1][column+1] == 1) {
            count++;
        }
        if (Bacteria[row+1][column-1] == 1) {
            count++;
        }
        if (Bacteria[row-1][column-1] == 1) {
            count++;
        }
        return count;
    }



}

void changeGeneration(int **Bacteria, int rows, int columns) {

    for (int x = 0; x < rows; x++) {
        for (int y = 0; y < columns; y++) {
            int count = getNeighbors(Bacteria, rows, columns, x, y);

            if (Bacteria[x][y] == 1 && count < 2) {
                Bacteria[x][y] = 0;
            } else if (Bacteria[x][y] == 1 && count > 3) {
                Bacteria[x][y] = 0;
            } else if (Bacteria[x][y] == 0 && count == 3) {
                Bacteria[x][y] = 1;
            }
        }
    }
}

首先,有一種更簡單的方法來表達您要執行的操作:

  int count = 0;
  for (int n_row = row - 1; n_row <= row + 1; ++n_row) {
    for (int n_col = col - 1; n_col <= col + 1; ++n_col) {
      if (n_row >= 0 && n_row < rows && n_col >= 0 && n_col < columns
          && (n_row != row || n_col != col)) {
        if (Bacteria[n_row][n_col] == 1) {
            ++count;
        }    
      } 
    }
  } 

其次,當您說它沒有到達最后一行時,示例中的rows的值是多少? 請記住,總行數比最高行索引大一。 因此,如果您有行0、1、2、3和4,則rows應為5。

暫無
暫無

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

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