0

所以我有一个“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 的二维数组。为了直观地查看我生成的具有红色背景的 UIView 的值,并将它们粘贴在屏幕上,以查看我的数组大小。这就是返回的图像(蓝色箭头后来被Photoshop处理以指示最长的垂直线(我们想要保留的值)

在此处输入图像描述

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

在此处输入图像描述

我在想可能类似于生成一个for循环的东西,该循环将跟踪每列中的所有“1”值以及一组可能连续相邻且数量最多的任何给定6列“1”值是最长垂直线最有可能位于的区域(6 列宽),但我可以看到一些问题,我也不知道如何获取属于该行的行在我有了专栏之后....嗯






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

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

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

4

2 回答 2

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)

于 2013-05-26T06:47:21.430 回答
0

您的要求不是很精确,这让我认为您需要更加努力地思考您想要什么,或者更清楚地说明它。看一下附图:

蛇

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

于 2013-05-26T07:23:59.927 回答