Трудности с заливкой в ​​C ++ - PullRequest
0 голосов
/ 05 марта 2012

Я сделал эту программу, которая должна заполнить матрицу, но что-то пошло не так. Вот код:

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 Ответ

1 голос
/ 05 марта 2012

Вы устанавливаете координаты 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);
    } 
}
...