2D数组 - 检查具有最多“on”值的列

时间:2013-05-26 05:44:08

标签: ios objective-c arrays sorting multidimensional-array

所以我有一个“1”和“0”值的二维数组,一个值可以打开或关闭,这可以生成形状,我想检查垂直线,例如:

[0,0,1,0,1,0,0,0]
[0,0,0,0,1,0,0,0]
[0,1,0,0,1,0,0,0]
[0,0,0,0,1,0,0,0]
[1,0,0,0,1,0,0,0]
[0,0,0,0,1,0,0,0]

在第5列中有一条垂直线,所以我们将返回那些并删除所有其他结果(将不属于该行的1更改为0 ...)

[0,0,0,0,1,0,0,0]
[0,0,0,0,1,0,0,0]
[0,0,0,0,1,0,0,0]
[0,0,0,0,1,0,0,0]
[0,0,0,0,1,0,0,0]
[0,0,0,0,1,0,0,0]

我的二维数组要复杂得多,它大约是一个300x600的2D数组。为了直观地看到我用红色背景生成UIViews的值,并将它们粘贴在我的数组大小的视图中。这就是返回的图像(蓝色箭头后来被用于指示最长的垂直线(我们想要保留的值)

enter image description here

那么在二维数组中找到最长的垂直线(“1”值)并将所有其他值更改为零的好方法是什么。 (因此,如果我再次以可视图形格式渲染数组,则仅显示此数据(其他红点逐渐淡出,因为它们已从“1”值更改为“0”值。)

enter image description here

我想的可能是生成一个for循环的东西,它会跟踪每列中的所有“1”值以及一组可能任意给定的6列,这些列是连续的彼此相邻的最大量的“1”值是最长的垂直线最有可能位于的区域(6列宽),但我可以看到一些问题,我也不知道如何获取部分行我有列之后那条线......嗯......






*注意:我正在制作我的“二维数组”,只需要一个固定列数的变量然后我有一个数组,它只包含所有列/行组合的所有值。例如,3x3板将是[0,0,0,0,1,0,0,0,0],我可以理解这意味着:

[0,0,0]
[0,1,0]
[0,0,0]

因为我知道每行总有3列。
[row1column1,row1column2,row1column3,row2column1,row2column2,row2column3,row3column1,row3column2,row3column3]

2 个答案:

答案 0 :(得分:0)

这是一些示例代码(您需要处理分配和一些语义 - 例如:将一个数组分配给另一个数组)

int array2d[];   // which is 1d from what I understood - this holds your initial values
int columnCount; // you already have the number of columns, this is the var that's holding it
int maxColumn[], column[]; // these will hold the values of the maximum column and the current looped column
int maxIndex = 0, max=0; // used to determine which of the columns is the longest
int rowCount = array2d.count/columnCount; // find out how many rows there are
// first loop through the entire array, set everything to '0', while storing the values of the longest column (so far) in a different array
for(int i=0; i<columnCount; i++){
    int columnSum = 0;
    int index = i;
    // go through every row of the column i
    for(int j=0; j<rowCount; j++, index+=rowCount){
        columnSum=columnSum+array2d[index];
        column[j]=array2d[index];
        array2d[index]=0;
    }
    if(columnSum>max){
        max = columnSum;
        maxIndex = i;     // the column index
        maxColumn = column;
    }
}
// we found the longest column (maxIndex), now we need to set its values back to what they were previously
int index = maxIndex;
for(int j=0; j<rowCount; j++, index+=rowCount){
    array2d[index]=maxColumn[j];
}

由于您希望找到连续6列中最长的列,我相信设置columnCount/=6;应该有效(它还会使rowCount = rowCount * 6)

答案 1 :(得分:0)

您的要求不是很精确,这让我觉得您需要更加思考自己想要的东西,或者更清楚地说出来。看看附图:

snake

这是六个像素宽,所以我想象你可以在你的图像中得到这种链。在任何列中都没有长于4的连接序列,但链本身长18像素。你需要处理这样的情况吗?如果是,那么仅对各列进行求和是不够的;你需要一个更复杂的方法,比如找到“连通组件”。