【问题标题】:check if index is out of bounds to satisfy if conditions检查索引是否超出范围以满足 if 条件
【发布时间】:2021-04-04 21:29:12
【问题描述】:

您好,我正在练习在 c++ 中使用 2d 数组,我的问题是,例如,如果我想检查 4 是否有 0 或 11 到北、东、南、西作为邻居,它应该返回 false。 这是我的如果

if((grid[0-1][0] == 0 || grid[0-1][0] == 11 ) && 
 (grid[0+1][0] == 0 || grid[0+1][0] == 11 )  &&
(grid[0][0+1] == 0 || grid[0][0+1] ==11)  &&
 (grid[0][0-1] == 0 || grid[0][0-1] ==11 ))
{
    return false;
}

现在我的问题是,由于 4 以西和 4 以北超出界限,它永远不会返回 false。 如何优化我的 if 条件以使其返回 false? 这是我的二维数组

int grid[ROW][COL] = {{ 4, 11, 1, 1 },
                  { 0, 0, 1, 0 },
                  { 0, 1, 5, 0},
                  { 0, 5, 0,0 } };

【问题讨论】:

  • 在检查邻居的值之前,您可以检查这些邻居是否真的存在。您可以从数组的边界计算它。
  • 如何优化我的 if 条件 -- 让我们看看您未优化的 if 条件,因为您发布的条件完全错误。如果不调用未定义的行为,您发布的代码将无法工作。 grid[0-1][0] 不是有效的数组访问。
  • 给棋盘的所有边缘设置一个 1 单元格边框,并使用无效值流行边框单元格。如果您这样做,则不需要对越界检查进行特殊测试。例如,一个 8x8 的棋盘将是 10x10,边界单元格填充了无效的棋子值。

标签: c++ if-statement


【解决方案1】:

TL;DR 你缺少边界条件

// Boundary Conditions
    if( i == ROW || j == COL || i < 0 || j < 0 )
        return false;

基于问题,矩阵定义为

#define ROW 4
#define COL 4

int grid[ROW][COL] = {{ 4, 11, 1, 1 },
                      { 0, 0, 1, 0 },
                      { 0, 1, 5, 0},
                     { 0, 5, 0,0 } };

给定一个位于row icol j 的单元格,由坐标i, j 表示,二维数组中的可视化将如下所示

i-1, j-1    i-1, j      i-1,j+1
  i, j-1      i, j        i,j+1
i+1, j-1    i+1, j      i+1,j+1

从上面我们现在可以推断出给定i,j的相应坐标/点引用

i,j ---> North( i-1, j  )
i,j ---> South( i+1, j  )
i,j --->  East( i  , j+1)
i,j --->  West( i  , j-1)

现在我们可以编写一个小函数来检查由 i 和 j 表示的任何单元格的给定值是否为真,下面的函数执行类似的操作.. 检查提供的坐标是否在边界内以及 @987654329 处的值是否@ 匹配我们需要匹配的内容

bool Check( int grid[ROW][COL], int expected, int i, int j )
{
    // Boundary Conditions
    if( i == ROW || j == COL || i < 0 || j < 0 )
        return false;

    return ( grid[i][j] == expected );
}

现在是时候将 North、South、West、East 的计算编码并作为不错的函数公开了,

bool northHas( int grid[ROW][COL], int expected, int i, int j )
{
    return check(grid, expected, i-1, j );
}

bool southHas( int grid[ROW][COL], int expected, int i, int j )
{
    return check(grid, expected, i+1, j );
}


bool eastHas( int grid[ROW][COL], int expected, int i, int j )
{
    return check(grid, expected, i, j+1 );
}


bool westHas( int grid[ROW][COL], int expected, int i, int j )
{
    return check(grid, expected, i, j-1 );
}

上面的每个函数都提供了一个更好的接口来处理逻辑程序想要做什么

if( (northHas( grid, 0, i, j ) || northHas( grid, 11, i, j)) && 
    ( eastHas( grid, 0, i, j ) ||  eastHas( grid, 11, i, j)) &&
    (southHas( grid, 0, i, j ) || southHas( grid, 11, i, j)) &&
    ( westHas( grid, 0, i, j ) ||  westHas( grid, 11, i, j)) )
{
    return false
}
    

【讨论】:

  • 感谢您的回答。 eastHas( grid, i, j, 0) 不应该是eastHas( grid, 0, i, j) 吗?
  • 所以例如数组看起来像这样 {{ 4, 11, 1, 1 }, { 1, 1, 1, 0 }, { 0, 1, 5, 0}, { 0, 5, 0,0 } }; 它不会返回 false 对吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-08-05
  • 2019-01-22
  • 2021-08-22
  • 1970-01-01
  • 2020-09-03
  • 2017-07-21
  • 1970-01-01
相关资源
最近更新 更多