2011-10-31 121 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+組合,當我做了我的測試,所以我想我會使用雷納的答案,因爲它更接近,但很多謝謝,我真的很感激它 –