Ios 2D数组-检查包含“most”的列;关于;价值观

Ios 2D数组-检查包含“most”的列;关于;价值观,ios,objective-c,arrays,sorting,multidimensional-array,Ios,Objective C,Arrays,Sorting,Multidimensional Array,因此,我有一个包含“1”和“0”值的2D数组,一个值是开或关,这可以生成形状,我想检查垂直线,例如: [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…) 我的二维数组要复杂得多,它是一个300x600的二维数组。为了直观地看到这些值,我生

因此,我有一个包含“1”和“0”值的2D数组,一个值是开或关,这可以生成形状,我想检查垂直线,例如:

[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…)

我的二维数组要复杂得多,它是一个300x600的二维数组。为了直观地看到这些值,我生成了带有红色背景的UIView,并将它们粘贴在屏幕上的数组大小的视图中。这就是返回的图像(蓝色箭头后来经过Photoshop处理以指示最长的垂直线(我们希望保留的值)

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

我在想,可能会生成一个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]
以下是一些示例代码(您需要注意分配和一些语义-例如:将一个数组分配给另一个数组)

int-array2d[];//据我所知,这是1d-它保存初始值
int columnCount;//您已经有了列数,这是保存它的变量
int maxColumn[],column[];//这些将保存最大列和当前循环列的值
int maxIndex=0,max=0;//用于确定哪列最长
int rowCount=array2d.count/columnCount;//找出有多少行
//首先遍历整个数组,将所有内容设置为“0”,同时将最长列(到目前为止)的值存储在不同的数组中

对于(int i=0;i您的要求不是很精确,这使我认为您需要更仔细地思考您想要什么,或者更清楚地说明。请看附图:


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

为什么不为每列创建变量数\u计数器。并继续计算每列中的1数。结果将是最大1。@AnoopVaidya这是我在问题中描述的方法,但我会检查一行中任何给定6列的总值,因为垂直线不是100%垂直的,但它可以跨越0-6列左右的散射(如上图所示)但是,我如何消除不属于该行的行值呢?:o使用
位字段之类的内容会更容易,但只要使用ObjC,就更容易实现OO。您不必枚举所有这些数组。这效率非常低。@CodaFi如果不循环,他还能找到最大值吗h读取每个值的数组?简单:用一个数据类型表示这些数组。NSMutableArray不必循环自身来获取计数,它只需在发生变化时更新。如果他使用对象(我在注释中建议使用类似于位字段的内容),那么他就可以获得封装的所有好处,而不使用O(n+m)循环业务。@CodaFi我不是循环获取计数,而是读取值,这样我就可以找到哪个列的值最多==1。他还有一个1D数组,他用它来表示2D数组,这就是rowCount和columnCount的用途。复杂性主要是O(2*n)(在这种情况下,每列的“开”值都比前一列多,具体取决于maxColumn=column的复杂程度)-请注意,第一个for循环实际上只经过数组一次,而不是以线性顺序。
[0,0,0]
[0,1,0]
[0,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];
}