查找数字是否在二维网格中

时间:2017-09-08 00:46:35

标签: c++

因此,对于此分配,我们需要创建一个2D网格,并允许输入网格的宽度,高度和每个元素。接下来,我们必须确定一个数字是否在另一个数字的2个元素内,如果是,则计算它。

我目前尝试的是:(BUFFER1ROB_RANGE2

int isoCount(int **arr, int x, int y)
{
  int count = 0;

  for(int i = 0; i < x; i++) {
    for(int j = 0; j < y; j++) {
      if(arr[i][j] != 0) {
        //This is so gross
        if( ( (arr[i + ROB_RANGE] && arr[i + BUFFER] &&
          arr[i - ROB_RANGE] && arr[i - BUFFER] ) == 0 or NULL) ) {
            if(DEBUG)
              cout << "Array: " << arr[i][j] << endl;
            count++; //Counts how many times we find a lone robot
        }
      }
    }
  }
  return count;
}

然而,这并不总是准确的。通过提供的样本,我通常约为1次计数(当答案应为5时,则为6)。在零到+ 2或-2的情况下似乎将其抛弃。

以下是一个示例:

网格:

   0 1 2 3 4 5 6 7
  +---------------
0 |1 0 0 0 1 1 0 1
1 |0 0 0 0 1 1 0 0
2 |0 1 0 2 0 2 0 0
3 |0 0 0 0 0 0 0 0
4 |1 0 0 2 0 2 0 1 

输出应为5,但我得到6。

1 个答案:

答案 0 :(得分:0)

由于我们无法澄清问题,我只是尝试解决OP问题中的一些明显错误,然后看看提议的解决方案解决了哪个问题。

1)原始代码中的错误

核心检查是

if ( ( (arr[i + ROB_RANGE] && arr[i + BUFFER] && 
        arr[i - ROB_RANGE] && arr[i - BUFFER]) == 0 or NULL) ) {

我强烈认为是OP C ++版本:如果当前元素左侧和右侧2个位置内的所有元素都是0或位于网格外。不幸的是,这种情况并非如此。该行代码表示:如果指向当前列的左侧和右侧2位内的列的开头的任何指针为0

基本上,如果要检查a和b是否都等于0,则表达式应为a==0 && b==0。表达式(a && b) == 0表示:( (a != 0) && (b != 0) ) == 0,相当于!( (a != 0) && (b != 0) ),而De Morgan定理变为:(a == 0) || (b == 0)

此外,你为什么要检查指针?您应该检查使用两个索引的值。如果你检查网格限制之外的值,那么没有神奇的空值可以节省你的时间。你正在读随机的东西。因此,解决方案是确保不要超出图像范围。

无论如何,我相信OP想要的是

中的内容
bool c1, c2, c3, c4;
c1 = c2 = c3 = c4 = true;
if (i + ROB_RANGE < x)
    c1 = arr[i + ROB_RANGE][j]==0;
if (i + BUFFER < x)
    c2 = arr[i + BUFFER][j]==0;
if (i - ROB_RANGE >= 0)
    c3 = arr[i - ROB_RANGE][j]==0;
if (i - BUFFER >= 0)
    c4 = arr[i - BUFFER][j]==0;

if (c1 && c2 && c3 && c4) {

现在,这解决了什么?

2)此代码解决了问题

假设我们有一个x倍y数的网格。每个人都可以由(i,j)标识,其中i是水平方向,j是垂直方向。计算有多少非零数字在左侧和右侧两个位置只有零,即如果(i,j)处有非零数字,则位置(i-2,j),{{1 },(i-1,j)(i+1,j)应包含零或超出网格限制。

这是原始问题吗?我不这么认为,但是没有办法知道......