2015-07-02 166 views
0

我試圖解決這個問題:矩陣穿越/ C++

鑑於「1'(土地)和」 0'(水)二維柵格地圖,算上島的數量。一個島被水包圍,並且通過水平或垂直連接相鄰的陸地而形成。你可以假設網格的所有四個邊都被水包圍。

實施例1:

11110 
11010 
11000 
00000 

我的解決辦法是:

#include <iostream> 
#include <cstdlib> 

#define N 5 
#define M 4 

using namespace std; 

int a[5][4] = 
{ 
    1,1,1,1,0, 
    1,1,0,1,0, 
    1,1,0,0,0, 
    0,0,0,0,0 
}; 

int counter = 0; 


void dfs(int i, int j) 
{ 
    a[i][j] = 0 ; 
    if (i - 1 >= 0) dfs(i - 1, j); 
    if (i + 1<M) dfs(i + 1, j); 
    if (j - 1 >= 0) dfs(i, j - 1); 
    if (j + 1<N) dfs(i, j + 1); 
} 

int main() 
{ 
    int i = 0, j = 0; 
    for (; i < M; i++) 
    { 
     for (j = 0; j < N; j++) 
     { 
      if (a[i][j] != 0) { 
       dfs(i, j); 
       counter++; 
      } 
     } 
    } 
    cout <<"No. Of Islands: "<<counter<< endl; 
} 

該溶液顯示Visua工作室異常。調用dfs函數時,我看不到它出錯的地方。

+1

沒問題。 –

+0

a [5] [4]' - >'a [4] [5]'?還有'i BLUEPIXY

+0

@iharob plz請參閱編輯。 – adrian008

回答

1

您需要dfs函數的結束條件。在功能的開頭加上這一行:

if (a[i][j]==0) return; 
1

問題是此行

cout <<"No. Of Islands: "+counter<< endl; 

"No. Of Islands: "是一個字符串文字。將counter添加到它,正在向const char *添加一個偏移量,這不是您想要的。另外,如果counter足夠大(它是),它會嘗試讀出界限。它需要

cout <<"No. Of Islands: " << counter << endl; 

這將流countercout將它理解爲一個int並將其輸出作爲這樣。