如何查看该字段的 8 个邻居?我的意思是有些字段只有 3 个邻居,因为它们位于数组的边界上。感谢帮助
user2883073
问问题
117 次
3 回答
2
是的,因此您需要通过检查行和列值是否为 0 或高度/宽度来考虑这一点。如果您只是将值相加,您可能会发现最简单的方法是使用仅返回数组中的值的方法,或者如果您要求的值超出范围,则为 0:
int GetValue(int[,] array, int x, int y)
{
if (x < 0 || y < 0 ||
x >= array.GetLength(0) || y >= array.GetLength(1))
{
return 0;
}
return array[x, y];
}
然后你可以使用:
for (int x = 0; x < array.GetLength(0); x++)
{
for (int y = 0; y < array.GetLength(0); y++)
{
int total = GetValue(array, x - 1, y - 1)
+ GetValue(array, x, y - 1)
+ GetValue(array, x + 1, y - 1)
+ GetValue(array, x - 1, y)
+ GetValue(array, x + 1, y)
+ GetValue(array, x - 1, y + 1)
+ GetValue(array, x, y + 1)
+ GetValue(array, x + 1, y + 1);
// Do something with the total
}
}
请注意,GetLength
这里的所有调用都非常低效。有一些替代方案会更有效,但更复杂一些。
于 2013-11-05T08:03:30.543 回答
0
这绝对可以写得更短,但很容易理解:
int[,] theArray = new int[4,4]{{1,2,3,4},{1,2,3,4},{1,2,3,4},{1,2,3,4}};
bool above = true;
bool below = true;
bool left = true;
bool right = true;
for (int i = 0; i < theArray.GetLength(0); i++)
{
for (int j = 0; j < theArray.GetLength(1); j++)
{
above = true; below = true; left = true; right = true;
if (i == 0)
{
above = false;
}
if (i == theArray.GetLength(0) - 1)
{
below = false;
}
if (j == 0)
{
left = false;
}
if (j == theArray.GetLength(1) - 1)
{
right = false;
}
if (above)
{
if (left)
{
CheckField(i - 1, j - 1, theArray);
}
CheckField(i - 1, j, theArray);
if (right)
{
CheckField(i - 1, j + 1, theArray);
}
}
if (left)
{
CheckField(i, j - 1, theArray);
}
if (right)
{
CheckField(i, j + 1, theArray);
}
if (below)
{
if (left)
{
CheckField(i + 1, j - 1, theArray);
}
CheckField(i + 1, j, theArray);
if (right)
{
CheckField(i + 1, j + 1, theArray);
}
}
}
}
public void CheckField(int i, int j, int[,] theArray)
{
// do your stuff...
}
于 2013-11-05T08:24:47.963 回答
0
因为我不知道你想做什么我在这里有这个邻居类:
public class Neighbour
{
public Neighbour(int x, int y, int value)
{
this.x = x;
this.y = y;
this.value = value;
}
public int x { get; set; }
public int y { get; set; }
public int value { get; set; }
}
这里有一个功能:
public List<Neighbour> checkArrayField(int[,] array, int coord_x, int coord_y)
{
List<Neighbour> ret = new List<Neighbour>();
for (int i = coord_x - 1; i < array.GetLength(0) && i <= coord_x+1; i++)
{
for (int j = coord_y - 1;j < array.GetLength(1) && j <= coord_y+1; j++)
{
if(( i >= 0 && j >= 0 && i != coord_x | j != coord_y) ) //Not the Element in the Middle or negative indices
{
ret.Add(new Neighbour(i, j, array[i, j]));
}
}
}
return ret;
}
供测试用:
int[,] array = new int[4, 4] { { 1, 2, 3, 4 },
{ 5, 6, 7, 8 },
{ 9,10,11,12 },
{13,14,15,16 } };
List<Neighbour> Neighbours = checkArrayField(array, 0, 0);
那么你有一个包含邻居的列表(坐标和值)并且可以对他们做任何你想做的事情希望这会有所帮助
于 2013-11-05T13:25:53.640 回答