你好,我正在练习使用C++中的二维数组,我的问题是,例如,如果我想检查4是否有0或11在北,东,南,西作为邻居,它应该返回false。这是我的if
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 } };
您缺少边界条件
// 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 } };
给定一个位于行I
和列J
的单元格,由cordined的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
的cordinates/points引用
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表示的单元格上的给定值是否为真,下面的函数做类似的操作。检查提供的坐标是否在边界内,以及网格[j]j]
处的值是否与我们需要匹配的值相匹配
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
}