Operația de umplere poate fi sistematizată astfel:
- avem un anumit element al matricei, precizat prin coordonatele sale – elementul curent;
- dacă elementul curent respectă anumite restricții (este în matrice, nu conține obstacol, nu a fost deja marcat):
- îl marcăm;
- continuăm în același mod cu fiecare vecin al său.
Ultima etapă – continuarea în mod similar cu vecinii elementului curent, ne duce cu gândul la recursivitate. Următorul program realizează umplerea pornind dintr-o poziție dată:
#include <iostream>
using namespace std;
const int di[]={-1, 0, 1, 0},
dj[]={ 0, 1, 0,-1};
int A[101][101], n , m, istart , jstart;
void Fill(int i ,int j ,int v)
{
// i,j - elementul curent, v - valoarea cu care facem Fill
if(i >= 1 && i <= n && j >= 1 && j <= m && A[i][j] == 0)
{ // in matrice, element liber si nemarcat
A[i][j] = v;
for(int k = 0 ; k < 4 ; k ++)
Fill(i + di[k] , j + dj[k], v);
}
}
int main()
{
cin >> n >> m;
for(int i = 1 ; i <= n ;i ++)
for(int j = 1 ; j <= m ; j ++)
cin >> A[i][j];
cin >> istart >> jstart;
Fill(istart, jstart, 2);
for(int i =1 ; i <= n ;i ++, cout << endl)
for(int j = 1; j <= m ; j ++)
cout << A[i][j] << " ";
return 0;
}