マトリックスを塗りつぶすこのプログラムを作成しましたが、何かがうまくいきませんでした。コードは次のとおりです。
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;
}
Point は、先ほどコードで定義した構造体で、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 が返されますが、そうすべきではありません)。