如果条件在更改条件序列时计算为false.(C++)



我正试图解决"在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的正确结果。

最新更新