二维数组中所选元素的总和(方框形状?)

时间:2015-07-20 21:32:01

标签: c# arrays loops multidimensional-array sum

我目前正在创建一个二维数组来表示要为游戏布局的网格上的元素。我希望能够总结一个特定的元素块,但我似乎无法使我的函数正常工作,我怀疑有一个更简单的方法来做到这一点。

数组示例:

int[6,6] myArray = {{2,1,4,3,1,2,5}
                ,{4,2,3,3,1,2,4}
                ,{3,4,9,1,2,7,5}
                ,{1,6,2,1,3,4,2}
                ,{2,1,4,6,2,1,0}
                ,{6,2,8,1,6,5,7}
                ,{7,6,10,3,9,7,2}};

当前代码:

int BoxSum(int x, int y, int x1, int y1,  int [,] arrayM) {
        int Results = 0; 
        int xmod = (x1 - x) / Mathf.Abs (x1 - x);
        int ymod = (y1 - y) / Mathf.Abs (y1 - y);
        if (x1 > x & y1 > y) {
            for (int ix = x; ix <= x1; ix ++) {
                for (int iy = y; iy <= y1; iy++) {
                    Results += arrayM [ix, iy];
                }
            }
        }
        if (x1 > x & y1 < y) {
            for (int ix = x; ix <= x1; ix ++) {
                for (int iy = y; iy <= y1; iy--) {
                    Results += arrayM [ix, iy];
                }
            }
        }
        if (x1 < x & y1 < y) {
            for (int ix = x; ix <= x1; ix --) {
                for (int iy = y; iy <= y1; iy--) {
                    Results += arrayM [ix, iy];
                }
            }
        }
        if (x1 < x & y1 > y) {
            for (int ix = x; ix <= x1; ix ++) {
                for (int iy = y; iy <= y1; iy--) {
                    Results += arrayM [ix, iy];
                }
            }
        }
        return Results;
    }

所以,如果我要输入:

(BoxSum(1,1,5,5,myArray));

(BoxSum(5,5,1,1,myArray));

我希望两者都得到86(无论我是否在命令中输入x,y或x1,y1)。现在他们给我不同的结果,86和0。

感谢您的帮助!

3 个答案:

答案 0 :(得分:3)

如果你想让它工作而不管哪个参数是高/低值,你可以这样做。

    private int BoxSum(int x, int y, int x1, int y1, int[,] arrayM)
    {
        int lowestX = (x1 > x) ? x : x1;
        int lowestY = (y1 > y) ? y : y1;

        int highestX = (x1 > x) ? x1 : x;
        int highestY = (y1 > y) ? y1 : y;

        int sum = 0;

        for (int i = lowestX; i < highestX; i++)
        {
            for (int j = lowestY; j < highestY; j++)
            {
                sum += arrayM[i, j];
            }
        }

        return sum;
    }

答案 1 :(得分:2)

如果我正确地阅读您的问题,您只需要一个用于循环的嵌套,这样: 编辑:忘记了对开始和停止位置进行排序的位!添加它。 同时考虑使用数学min和max

的phoogs建议
using System;
public class boxes{
public int[6,6] myArray;
public void boxes(){ // This is just a constructor. 
myArray = {{2,1,4,3,1,2,5}
                ,{4,2,3,3,1,2,4}
                ,{3,4,9,1,2,7,5}
                ,{1,6,2,1,3,4,2}
                ,{2,1,4,6,2,1,0}
                ,{6,2,8,1,6,5,7}
                ,{7,6,10,3,9,7,2}};
}
public int BoxSum(int x, int y, int x1, int y1) {
int sum = 0;
int xstart = Math.Min(x1, x);
int ystart = Math.Min(y1, y);
int xend = Math.Max(x1, x);
int yend = Math.Max(y1, y);
for(int i=xstart;i<=xend;i++)
{
    for(int j=ystart;j<=yend;j++)
    {
        sum += myArray[i,j];
    }
}
return sum;
}
}

我写了一个简单的课程,我假设你有类似的东西。如果该方法是包含您的数组的类的成员,则您不需要将其传递给该方法。

答案 2 :(得分:1)

现有的答案都没有解释为什么你在一个案例中得到了错误的结果。问题是处理该情况的块中的错误:

if (x1 < x & y1 < y) {
    for (int ix = x; ix <= x1; ix --) {
        for (int iy = y; iy <= y1; iy--) {
            Results += arrayM [ix, iy];
        }
    }
}

应该是:

if (x1 < x & y1 < y) {
    for (int ix = x; ix >= x1; ix --) {
        for (int iy = y; iy >= y1; iy--) {
            Results += arrayM [ix, iy];
        }
    }
}

这是Don't repeat yourself(DRY)原则重要原因的一个很好的例子。让自己避免头痛,并像其他答案一样做。