我正在做 leetcode 问题 289. 生命游戏 在运行我粘贴在下面的代码时,出现以下错误
第 1034 行:字符 34:运行时错误:将无符号偏移添加到 0x608000000020 溢出到 0x608000000008 (stl_vector.h) 总结:UndefinedBehaviorSanitizer:undefined-behavior /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/stl_vector.h :1043:34
我尝试使用打印语句来了解似乎是 for 循环适用于索引 [0][0] 并且不会移动到下一个索引的问题。我也粘贴了下面的打印语句。如果有人可以帮助我将非常感谢
0 代表循环 i 0 代表循环 j 0输入行 0行 1col 1个 0输入行 1排 0 列 1个 0输入行 -1行 0col
class Solution {
public:
int countLives(vector<vector<int>>& board, int & i, int &j)
{
int count=0;
vector<vector<int>> directions={{0,1},{1,0},{-1,0},{0,-1},{-1,-1},{1,1}, {-1,1},{1,-1}};
for(int k=0;k<directions.size();k++)
{
int r=(i+directions[k][0]);
cout<<i<<"input row"<<endl;
cout<<r<<"row"<<endl;
int c=j+directions[k][1];
cout<<c<<"col"<<endl;
if(r>=0 && r<board.size() && c>=0 && c<board[0].size() && board[r][c]==1|| board[r][c]==2)
count++;
cout<<count<<"count"<<endl;
}
return count;
};
void gameOfLife(vector<vector<int>>& board) {
if(board.size()==0)
return;
for(int i=0;i<board.size();i++)
{
for(int j=0;j<board[0].size();j++)
{
cout<<i<<" for loop i "<<j<<" for loop j"<<endl;
int count=countLives(board,i,j);
if(board[i][j]==1 && count<2 || count>3)
board[i][j]=2;
if(board[i][j]==0 && count==3)
board[i][j]=3;
}
}
cout<<"done counting"<<endl;
for(int i=0;i<board.size();i++)
{
for(int j=0;j<board[0].size();j++)
{
if(board[i][j]==3)
board[i][j]=1;
if(board[i][j]==2)
board[i][j]=0;
}}
}
};
答案 0 :(得分:2)
if(r>=0 && r<board.size() && c>=0 && c<board[0].size() && board[r][c]==1|| board[r][c]==2)
&&
运算符的优先级高于 ||
,参见 https://en.cppreference.com/w/cpp/language/operator_precedence,因此解析为
if( (r>=0 && ... && board[r][c]==1) || board[r][c]==2)
因此,例如,如果 r
为负,则 ||
的左侧操作数将为假,然后程序将评估右侧操作数 board[r][c]==2
,即当然无效,因为 r
是负数。
你可能是说
if(r>=0 && r<board.size() && c>=0 && c<board[0].size() && (board[r][c]==1 || board[r][c]==2))
并且您可能还想将其分成几行,以便更具可读性。这可能使错误更容易被发现。
作为一般规则,每当在表达式中混合 &&
和 ||
时,始终使用显式括号而不是依赖运算符优先级。 (阅读你的代码的人可能会发现优先级也很难记住。)
有一个类似的错误
if(board[i][j]==1 && count<2 || count>3)