gpt4 book ai didi

c# - 检查矩阵中的相邻数字

转载 作者:行者123 更新时间:2023-11-30 21:49:42 25 4
gpt4 key购买 nike

我如何计算 3x3 矩阵中的所有相邻元素,它可能看起来像这样

1  1  1
1 0 0
0 0 0

我想要的输出是(方括号中是索引 [x,y],我只关心数字,索引是为了准确性)[0,0] - 2, [1,0]- 3, [2,0]- 1, [0,1]-2, 等等...我不计算中间的数字。

我有一个大矩阵,任务是遍历每个数字,想象这个矩阵并计算中间数字周围有多少个。这是我的代码,但我无法让它工作。

这是我的方法:

public int CheckArea(int cordX, int cordY)
{
int count = 0;
for (int i = cordX - 1; i <= cordX + 1; i++)
{
for (int j = cordY - 1; j <= cordY + 1; j++)
{
if (j != cordY && i != cordX && tileField[i, j])
{
count++;
}
}
}
return count;
}

这不应该是索引问题,因为我是这样设置矩阵的:

        tileField = new Boolean[width, height];
for (int x = 0; x < width; x++)
{
for (int y = 0; y < height; y++)
{
tileField[x, y] = false;
}
}

但我不打印第一列和最后一列和行,所以我的 Print 方法是:

public void Print()
{
for (int x = 1; x < this.width-1 ; x++)
{
for (int y = 1; y < this.height -1; y++)
{
if (!tileField[x, y])
{
Console.Write("0 ");
}
else
{
Console.Write("1 ");
}
}
Console.WriteLine("");
}

}

最佳答案

虽然这看起来似乎要求使用循环来减少代码,但您可能只想手动检查每个邻居,因为只有 8 种可能性。下面的解决方案假设您对围绕网格“环绕”不感兴趣,并且除了您要检查的坐标之外,该字段中没有任何其他行/列(例如顶部和左侧的缓冲区行和列边缘)。我建议执行以下操作:

public int CheckArea(int cordX, int cordY)
{
int count = 0;
int fieldWidth = tileField.GetLength(1);
int fieldHeight = tileField.GetLength(0);

// Check for the neighbor to the North
if(cordY != 0)
{
count += GetValueAtCoordinate(cordX,cordY - 1);
}
// Check for the neighbor to the East
if (cordX < fieldWidth - 1)
{
count += GetValueAtCoordinate(cordX + 1, cordY);

// NE neighbor
if(cordY != 0)
{
count += GetValueAtCoordinate(cordX - 1, cordY - 1);
}

// SE neighbor
if(cordY != fieldWidth - 1)
{
count += GetValueAtCoordinate(cordX - 1, cordY + 1);
}
}
// Check for the neighbor to the South
if (cordY < fieldHeight - 1)
{
count += GetValueAtCoordinate(cordX, cordY + 1);
}
// Check for the neighbor to the West
if (cordX != 0)
{
count += GetValueAtCoordinate(cordX - 1, cordY);

// NW neighbor
if(cordY != 0)
{
count += GetValueAtCoordinate(cordX - 1, cordY - 1);
}

// SW neighbor
if(cordY != fieldHeight - 1)
{
count += GetValueAtCoordinate(cordX - 1, cordY + 1);
}
}

return count;
}

public int GetValueAtCoordinate(int x, int y)
{
return tileField[x,y] == true ? 1 : 0;
}

您可以使用各种其他方法,但除非有特定原因,否则您不想使用检查每个邻居的简单路径,我不认为您真的可以通过循环节省任何时间。我还添加了一个方法,它将给定坐标处的 bool 值转换为 1 表示 true 和 0 表示 false,因为看起来您的矩阵是 bool 类型。

编辑如果您将其视为 1 索引数组,只需将使用 fieldWidth 和 fieldHeight 变量的边缘检查更改为不减少 1。

关于c# - 检查矩阵中的相邻数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36779050/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com