我正在处理包含元胞自动机方法的项目。我想要的是如何编写函数来帮助查找二维数组中的所有邻居。 例如我已经得到了大小x尺寸2D阵列[大小= 4这里]标记为x [0,0指数]在矩阵中寻找邻域
[x][n][ ][n]
[n][n][ ][n]
[ ][ ][ ][ ]
[n][n][ ][n]
字段有邻居标记为[N] - > 8楼的邻居。什么我试图做的是写一个函数,可以找到邻居窝写数千if语句
有没有人有一个想法如何做到这一点? 谢谢
我正在处理包含元胞自动机方法的项目。我想要的是如何编写函数来帮助查找二维数组中的所有邻居。 例如我已经得到了大小x尺寸2D阵列[大小= 4这里]标记为x [0,0指数]在矩阵中寻找邻域
[x][n][ ][n]
[n][n][ ][n]
[ ][ ][ ][ ]
[n][n][ ][n]
字段有邻居标记为[N] - > 8楼的邻居。什么我试图做的是写一个函数,可以找到邻居窝写数千if语句
有没有人有一个想法如何做到这一点? 谢谢
对于元素(I,J)的N×M的矩阵邻居:
int above = (i-1) % N;
int below = (i+1) % N;
int left = (j-1) % M;
int right = (j+1) % M;
decltype(matrix[0][0]) *indices[8];
indices[0] = & matrix[above][left];
indices[1] = & matrix[above][j];
indices[2] = & matrix[above][right];
indices[3] = & matrix[i][left];
// Skip matrix[i][j]
indices[4] = & matrix[i][right];
indices[5] = & matrix[below][left];
indices[6] = & matrix[below][j];
indices[7] = & matrix[below][right];
'(0-1)%N'可能与(N-1)不同,用'(i + N-1)%N'代替。 – Jarod42
在所有可能的排列中对坐标进行加减运算。超出边界的结果环绕(例如,-1
变为3
,4
变为0
)。基本上只需要几个简单的循环。
喜欢的东西
// Find the closest neighbours (one step) from the coordinates [x,y]
// The max coordinates is max_x,max_y
// Note: Does not contain any error checking (for valid coordinates)
std::vector<std::pair<int, int>> getNeighbours(int x, int y, int max_x, int max_y)
{
std::vector<std::pair<int, int>> neighbours;
for (int dx = -1; dx <= 1; ++dx)
{
for (int dy = -1; dy <= 1; ++dy)
{
// Skip the coordinates [x,y]
if (dx == 0 && dy == 0)
continue;
int nx = x + dx;
int ny = y + dy;
// If the new coordinates goes out of bounds, wrap them around
if (nx < 0)
nx = max_x;
else if (nx > max_x)
nx = 0;
if (ny < 0)
ny = max_y;
else if (ny > max_y)
ny = 0;
// Add neighbouring coordinates to result
neighbours.push_back(std::make_pair(nx, ny));
}
}
return neighbours;
}
示例使用了您:
auto n = getNeighbours(0, 0, 3, 3);
for (const auto& p : n)
std::cout << '[' << p.first << ',' << p.second << "]\n";
打印出
[3,3] [3,0] [3,1] [0,3] [0,1] [1,3] [1,0] [1,1]
这是正确的答案。
假设您在单元格(i, j)
中。然后,在无限网格上,你的邻居应该是[(i-1, j-1), (i-1,j), (i-1, j+1), (i, j-1), (i, j+1), (i+1, j-1), (i+1, j), (i+1, j+1)]
。
但是,由于网格是有限的,上述某些值将超出边界。但我们知道模运算:4 % 3 = 1
和-1 % 3 = 2
。所以,如果网格大小的n, m
你只需要在上面的列表上应用%n, %m
得到邻居的正确列表:[((i-1) % n, (j-1) % m), ((i-1) % n,j), ((i-1) % n, (j+1) % m), (i, (j-1) % m), (i, (j+1) % m), ((i+1) % n, (j-1) % m), ((i+1) % n, j), ((i+1) % n, (j+1) % m)]
,如果你的坐标是0
和n
之间和0
和m
之间的作品。如果你从1
开始,那么你需要通过做一个-1
和+1
某处来调整上述内容。
对于您的情况n=m=4
和(i, j) = (0, 0)
。第一个列表是[(-1, -1), (-1, 0), (-1, 1), (0, -1), (0, 1), (1, -1), (1, 0), (1, 1)]
。将模数运算应用到[(3, 3), (3, 0), (3, 1), (0, 3), (0, 1), (1, 3), (1, 0), (1, 1)]
,这些数字恰好是图片中标记为[n]
的正方形。
你是如何定义的邻居?它是两个轴上的距离为“!= 2”的单元格吗?还是有其他一些定义?这个例子并没有真正显示太多...... – viraptor