所以我有一个“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的值,并将它们粘贴在我的数组大小的视图中。这就是返回的图像(蓝色箭头后来被用于指示最长的垂直线(我们想要保留的值)
那么在二维数组中找到最长的垂直线(“1”值)并将所有其他值更改为零的好方法是什么。 (因此,如果我再次以可视图形格式渲染数组,则仅显示此数据(其他红点逐渐淡出,因为它们已从“1”值更改为“0”值。)
我想的可能是生成一个for循环的东西,它会跟踪每列中的所有“1”值以及一组可能任意给定的6列,这些列是连续的彼此相邻的最大量的“1”值是最长的垂直线最有可能位于的区域(6列宽),但我可以看到一些问题,我也不知道如何获取部分行我有列之后那条线......嗯......
[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]
答案 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)
您的要求不是很精确,这让我觉得您需要更加思考自己想要的东西,或者更清楚地说出来。看看附图:
这是六个像素宽,所以我想象你可以在你的图像中得到这种链。在任何列中都没有长于4的连接序列,但链本身长18像素。你需要处理这样的情况吗?如果是,那么仅对各列进行求和是不够的;你需要一个更复杂的方法,比如找到“连通组件”。