我一直很无聊,所以我创建了一个小型控制台扫雷游戏,在编写它时,我必须在 size*size 矩阵中找到一个元素的相邻位置,该矩阵表示为一个元素 vector 和一个变量,它保存尺寸值。我不想返回相邻元素的实际值,而是返回它们的位置,以便我可以将其用作公共(public)函数(否则客户可以看到地雷所在的位置 :P)。
例如,对于字段 eq 0 和大小 eq 3,该函数应返回 {1, 3, 4}:
1 0 0 0 1 0
0 0 0 => 1 1 0
0 0 0 0 0 0
嗯,基本上它看起来像这样:
vector<int> adjecantPositions(int field, int size)
{
int row = field / size;
int col = field % size;
vector<int> result;
/*
1 0 0
1 0 0
1 0 0
*/
if (col > 0)
{
result.push_back(calcField(row, col-1, size));
if (row > 0)
result.push_back(calcField(row-1, col-1, size));
if (row < size - 1)
result.push_back(calcField(row+1, col-1, size));
}
/*
0 0 1
0 0 1
0 0 1
*/
if (col < size - 1)
{
result.push_back(calcField(row, col+1, size));
if (row > 0)
result.push_back(calcField(row-1, col+1, size));
if (row < size - 1)
result.push_back(calcField(row+1, col+1, size));
}
/*
0 1 0
0 0 0
0 1 0
*/
if (row > 0)
result.push_back(calcField(row-1, col, size));
if (row < size - 1)
result.push_back(calcField(row+1, col, size));
return result;
}
calcField(int, int, int) 只是将坐标转换为字段编号 (row*size + col)。
这是一个快速的解决方案,但它并不优雅,我敢打赌有一些更好的方法可以做到这一点。有什么想法吗?
最佳答案
是的,你的代码很糟糕。这是一个更好的尝试(已修复,抱歉):
for (int dx=-1; dx<=1; dx++)
for (int dy=-1; dy<=1; dy++)
if (dx || dy){
int x = row+dx, y=col+dy;
if (x >= 0 && x < size && y >= 0 && y < size)
result.push_back(calcField(x, y, size));
}
关于c++ - 在矩阵中查找邻居位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1679768/