1

如何查看该字段的 8 个邻居?我的意思是有些字段只有 3 个邻居,因为它们位于数组的边界上。感谢帮助

4

3 回答 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 回答