[英]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.