我正试图解决"在2D矩阵中查找岛的数目";问题,我正在使用DFS技术来计算矩阵中相邻1的数量。
在dfs((函数中,当顺序中首先写入(arr[i][j] == '0')
条件时,条件-if( (arr[i][j]=='0') || i<0 || j<0 || i==r || j==c)
的计算结果为false,但当像这样写入-if(i<0 || j<0 || i==r || j==c || (arr[i][j]=='0'))
时,其计算结果为true。
此条件用于检查i和j的当前值是否不越界,以及矩阵的元素arr[i][j]
是否不等于"0"。
代码:
class Solution {
public:
void dfs(vector<vector<char>>& arr, int i, int j, int& r, int& c){
if( (arr[i][j]=='0') || i<0 || j<0 || i==r || j==c)
return;
// MARKED VISITED
arr[i][j] = '0';
dfs(arr,i,j+1,r,c);
dfs(arr,i,j-1,r,c);
dfs(arr,i+1,j,r,c);
dfs(arr,i-1,j,r,c);
}
int numIslands(vector<vector<char>>& arr) {
int rows=arr.size();
if(rows==0){return 0;}
int cols=arr[0].size();
int numOfIslands=0;
int i=0;
int j=0;
int r=arr.size();
int c=arr[0].size();
for( i=0;i<r;i++){
for( j=0;j<c;j++){
if(arr[i][j]=='1'){
dfs(arr, i , j,r,c);
numOfIslands++;
}
}
}
return numOfIslands;
}
};
此代码仅在矩阵中的元素为"1"时有效,但在遇到元素"0"时终止。有人能解释一下if条件失败的原因吗?
运算符||
(以及类似的运算符&&
(总是从左到右求值,当结果已知时,求值停止。因此,如果||
的左手侧为真,则不评估右手侧。这被称为短路评估。
因此,假设在这个表达式中i
等于-1
(arr[i][j]=='0') || i<0 || j<0 || i==r || j==c
然后访问arr[-1][j]
,这是一个越界数组访问,这意味着你的程序有未定义的行为,所以表达式可以计算为任何值,甚至可能崩溃。
但是在这个表达式中
i<0 || j<0 || i==r || j==c || (arr[i][j]=='0')
i<0
的求值结果为true
,因此整个表达式为true
,并且该表达式的其余子句未求值。因此,您可以避免第一个版本的未定义行为,并获得true
的正确结果。