【问题标题】:Sum of selected elements in 2d array (box shape?)二维数组中选定元素的总和(盒子形状?)
【发布时间】:2015-10-10 04:17:14
【问题描述】:

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

数组示例:

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。

感谢您的帮助!

【问题讨论】:

    标签: c# arrays loops multidimensional-array sum


    【解决方案1】:

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

        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;
        }
    

    【讨论】:

    • 好答案。我会使用 Math.Min 和 Math.Max。
    • 完美运行!谢谢!
    【解决方案2】:

    如果我没看错你的问题,你只需要一个嵌套 for 循环,所以: 编辑:忘记了整理开始和停止位置的位!添加它。 还接受 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;
    }
    }
    

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

    【讨论】:

    • 这是一个很好的答案,但我认为如果您使用 Math.Min 和 Math.Max 而不是那些条件运算符,代码的意图会更容易理解。
    【解决方案3】:

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

    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) 原则很重要的一个很好的例子。不要让自己头疼,按照其他答案的建议去做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-12
      • 2012-08-28
      • 2021-12-15
      • 2012-07-04
      • 2021-03-30
      相关资源
      最近更新 更多