2012-03-04 82 views
0

我做了這個程序,應該填滿矩陣,但出了點問題。這裏的代碼:用C++填充洪水的困難

queue<Point> Qu;  
int n,m; 
cin>>n>>m; 
int mat[n][m]; 
for(int i=0;i<n;++i)  
    for(int j=0;j<m;++j) 
     cin>>mat[i][j];   

Point N,W,S,E,bgn; 
bgn.x=0; 
bgn.y=0; 
Qu.push(bgn); 
while(!Qu.empty()){ 
    N.x=Qu.front().x-1; N.y=Qu.front().y; 
    S.x=Qu.front().x+1; S.y=Qu.front().y; 
    E.x=Qu.front().x; E.y=Qu.front().y+1; 
    W.x=Qu.front().x; W.y=Qu.front().y-1; 

    if(mat[N.x][N.y]==0){mat[N.x][N.y]=2;Qu.push(N);} 
    if(mat[S.x][S.y]==0){mat[S.x][S.y]=2;Qu.push(S);} 
    if(mat[E.x][E.y]==0){mat[E.x][E.y]=2;Qu.push(E);} 
    if(mat[W.x][W.y]==0){mat[W.x][W.y]=2;Qu.push(W);}  
    Qu.pop(); 
} 


for(int i=0;i<n;++i){  
    for(int j=0;j<m;++j) 
     cout<<mat[i][j]<<" ";   
    cout<<endl; 
} 

點是一個結構我在代碼中定義,它只包含x和y作爲整數。如果程序爲空,程序正確填充矩陣,例如: 如果我進入

 
3 3 
0 0 0 
0 0 0 
0 0 0 

我得到的輸出:

 
2 2 2 
2 2 2 
2 2 2 

但是,如果我輸入:

 
3 3 
0 0 1 
0 1 0 
0 0 1 

我得到

 
2 2 1 
2 1 2 
2 2 1 

代替

 
2 2 1 
2 1 0 
2 2 1 

如果我檢查每一個流行後的座標,我可以看到,它超出界限(如它返回座標1 -1,它不應該這樣做)。

回答

1

即使它們無效,您也可以設置N,W,S和E的座標;例如,如果您從(0,0)開始並執行此操作:

N.x=Qu.front().x-1; 
N.y=Qu.front().y; 
... 
if(mat[N.x][N.y]==0) { 
    mat[N.x][N.y]=2; 
    Qu.push(N); 
} 

N將爲(-1,0)。相反,如果您不在矩陣的邊界,只能檢查一個方向。例如對於N你可以這樣做:

if(Qu.front().x > 0) { 
    N.x=Qu.front().x-1; 
    N.y=Qu.front().y; 
    if(mat[N.x][N.y]==0) { 
     mat[N.x][N.y]=2; 
     Qu.push(N); 
    } 
} 
+0

您可能也喜歡讀這樣的:http://www.codeproject.com/Articles/6017/QuickFill-An-efficient-flood-fill-algorithm – j4x 2012-03-04 21:21:11

+0

這沒不會做任何改變,因爲如果該點的值爲零,我只向隊列中添加一個點。我不知道爲什麼程序將它放入隊列中。 – Transcendental 2012-03-04 21:23:13

+0

@LoadExcite問題是mat [-1,0]可能爲零。它沒有定義結果是什麼,所以它可以是任何值,包括零。當你嘗試讀取mat [-1,3]時,大多數C++實現可能會使用mat [3,2]的地址。這正是你的墊子[3,2]被填滿的原因。如果你的數組[3,3]你不能使用任何低於0或大於2的索引,因爲結果不符合你的期望。 – wimh 2012-03-05 08:08:49