2011-10-31 123 views
-1

我现在有具有数据这样的二维数组:计数特定细胞

X X X  X 
    X X X  X 
     X  X X 
     X X X X 
    X X  X X 
    X X X X X 

X标志着有数据的单元,空白意味着其空。 我一直在拉我的头发的最后一个小时试图找出如何计算我所说的“洞”。 它基本上是一个有两个单元之间有空数据的单元。 所以按顺序你可以看到从左到右分别有2,0,2,0,0孔。 我的功能需要返回总漏洞,所以对于这种情况4.

目前我已经完成了这个非常接近,但我的功能是计数第二个第一个单元格上的错误,我不知道如何解释这一点。

这里是我的实际代码:

public function countHoles(){ 
     $total = 0; 
     for($i=0; $i<5; $i++){ 
      $counting = false; 
      $passed = false; 
      for($j=0; $j<10; $j++){ 
       if(count($this->table[$j][$i])>0){ 
        $passed = true; 
       } 
       if($passed && !$counting && count($this->table[$j][$i])==0){ 
        $counting = true; 
       } 
       else{ 
        $counting = false; 
       } 
       if($passed && $counting){ 
        $total++; 
       } 
      } 
     } 
     return $total; 
    } 

您的帮助表示赞赏。

+0

是怎样的数组被赋值?这些“洞”是空的还是空的? – Reina

+1

我可能忘了提及每个单元格是一个数组 我正在做的只是计算它的元素 所以“洞”将由count($ this-> table [$ j] [$ i ])== 0' –

+2

@DanyKhalife:http://codegolf.stackexchange.com/ – ariefbayu

回答

1

我在JavaScript中有一个答案,试试这个:

var arr = [[1,2,3,null,5],[1,2,3,null,5],[null,2,null,null,5],[null,2,3,4,null],[1,null,null,4,5],[1,2,3,4,null]]; 
var hole = 0; 
for(var i=0; i<arr.length; i++){   
    for(var j=1; j<arr[i].length-1; j++){ 
     if(arr[i][j]==null){ 
      for(var k=j;k<arr[i].length; k++){ 
       if(arr[i][k] != null){ 
        k = arr[i].length; 
       }else{ 
        j++;       
       } 
      } 
      if(j < arr[i].length){     
       hole++; 
      } 
     } 
    } 
} 
alert(hole); 

“洞”是孔

+0

谢谢,如果所有的洞都是一个接一个的,这种方法非常有效 我已经得到通过这个部分,这个想法是行不通的,如果我有arr [i] [j] == null和arr [i] [j + 1] == null例如 来更好地说明这一点,数组是一天一个时间表的日程表 每个单元格可以有一个或更多的课程(数据),所以我在这里做的是找出我连续两个课程之间有多少个空闲时间 结果将进入另一个方法获得所有可能的时间表(我已经完成)并选择最少数量的洞 许多thx实际上帮助不像其他洞洞 –

+0

好吧,为了弄清楚这一点,你想知道是否有一个整体跨越两个缺口,但这不是开始还是结束?例如X 0 0 X X 0(其中0为空),在这种情况下有2个孔?或两个孔计为一个?我有点困惑哈哈 – Reina

+0

对不起,我很困惑:( 是的,你说的是正确的,这些算作2洞不是一个:) –

0

数量的VAR所以,如果我理解正确的话,你只是想知道有多少空您阵列中不在边缘的单元格。

类似于计算句子中空格的数量,但不计算开始或结束处的空格?

public function countHoles() 
{ 
    $total = 0; 

    // Start at 1 and go to Count() - 2 
    for($i = 0; $i < 5; $i++) // Horizontal 
    for($j = 1; $j < 9; $j++) // Vertical 
    { 
     if (j == 1) // 2nd row 
     { 
     if ($this->table[$i][$j] == null && $this->table[$i][0] != null) 
      $total++; 
     } 
     else if (j == 3) // 2nd last row 
     { 
     if ($this->table[$i][$j] == null && $this->table[$i][4] != null) 
      $total++; 
     } 
     else 
     { 
     if ($this->table[$i][$j] == null) 
      $total++; 
     } 
    } 

    return $total; 
} 

这是你的意思吗?

(您可能需要更换== null!= null你需要的任何其他“emptyness”检查此外,嵌套的IF显然可以凝结 - 我写了他们扩大了便于理解。)

+0

感谢您的答案,它给予了真正密切的计数,但它的一些失败800+组合,当我做了我的测试,所以我想我会使用雷纳的答案,因为它更接近,但很多谢谢,我真的很感激它 –