因此,对于此分配,我们需要创建一个2D网格,并允许输入网格的宽度,高度和每个元素。接下来,我们必须确定一个数字是否在另一个数字的2个元素内,如果是,则计算它。
我目前尝试的是:(BUFFER
为1
而ROB_RANGE
为2
)
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。
答案 0 :(得分:0)
由于我们无法澄清问题,我只是尝试解决OP问题中的一些明显错误,然后看看提议的解决方案解决了哪个问题。
核心检查是
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) {
现在,这解决了什么?
假设我们有一个x倍y数的网格。每个人都可以由(i,j)
标识,其中i
是水平方向,j
是垂直方向。计算有多少非零数字在左侧和右侧两个位置只有零,即如果(i,j)
处有非零数字,则位置(i-2,j)
,{{1 },(i-1,j)
,(i+1,j)
应包含零或超出网格限制。
这是原始问题吗?我不这么认为,但是没有办法知道......