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,它不應該這樣做)。
您可能也喜歡讀這樣的:http://www.codeproject.com/Articles/6017/QuickFill-An-efficient-flood-fill-algorithm – j4x 2012-03-04 21:21:11
這沒不會做任何改變,因爲如果該點的值爲零,我只向隊列中添加一個點。我不知道爲什麼程序將它放入隊列中。 – Transcendental 2012-03-04 21:23:13
@LoadExcite問題是mat [-1,0]可能爲零。它沒有定義結果是什麼,所以它可以是任何值,包括零。當你嘗試讀取mat [-1,3]時,大多數C++實現可能會使用mat [3,2]的地址。這正是你的墊子[3,2]被填滿的原因。如果你的數組[3,3]你不能使用任何低於0或大於2的索引,因爲結果不符合你的期望。 – wimh 2012-03-05 08:08:49