我无法弄清楚抓住网格中相邻垂直元素的思维过程。假设我有一个5x5
网格:
0 1 2 3 4
5 6 7 8 9
10 11 12 13 14
15 16 17 18 19
20 21 22 23 24
我想找到所有相邻的水平和垂直相邻元素并将它们放入一个数组中。数组的大小由每个元素之间可能的墙数(不计算外部数据)给出,例如。
1 | 2 | 3
--- --- ---
4 | 5 | 6
2x3的图表有7个墙,所以数组看起来像
1 2
2 3
4 5
5 6 //end of horizontal walls
1 4 //beginning of vertical walls
2 5
3 6
现在我已经找到了如何查找给定rows
和cols
的所有水平墙,其中walls
是我将存储结果的数组:
//find all horizontal walls in grid
//2-d array to store the element between the wall (0 1) (1 2)
for(int r = 0; r < rows; r++){
for(int c = 0; c < cols-1; c++){
int s = r > 0 ? -1*r : 0; //after first row always write over last space
walls[r*rows+c+s][0] = r*rows+c;
walls[r*rows+c+s][1] = r*rows+c+1;
}
}
但我只是迷失了如何确定如何确定所有垂直墙,在5x5
网格中,例如垂直墙将是
0 5
5 10
10 15
15 20
1 6
6 11
等...
这是我正在尝试的内容:
for(int r = 0; r < rows; r++){
for(int c = 0; c < cols; c++){
//just print the values at the moment, setting walls properly is easy
std::cout << r*rows+c*cols << " " << r*rows+c*cols+5 << std::endl;
}
}
唯一的问题是,在 1 的第一列之后,这不会重置,而是继续如下:
0 5
5 10
10 15
15 20
20 25 //nope, should be 1 6
和建议?非常感谢伪代码我希望对代码进行解释
答案 0 :(得分:0)
好的,刚刚找到解决方案,所以我会发布我所做的一切:
我遇到的问题是,当内部for循环离开并再次启动时,行最近没有返回到1,这是因为我仍然将r
乘以rows
,这实际上非常简单固定:
r*rows+c*cols << " " << r*rows+c*cols+5 <<
变为
r+c*cols << " " << r+c*cols+5 <<
我也在运行内部for循环太多次了,所以改变了
c < cols
应该变为c < cols-1
,现在输出为:
0 5
5 10
10 15
15 20
1 6
6 11
11 17
等...