#include #include #include using namespace std; int n; int m; int p; int val_m; int val_n; const int MAX_N = 1002; const int MAX_M = 1002; int S[MAX_M][MAX_N]; int comp_connessa; int punto_critico; int comp_tmp; //costruisco la matrice dei valori e poi cerco di applicare memoization tenendo come base la matrice dei valori; aumento o propago il numero all'interno di una cella considerando gli adiacenti. aumento il numero quando costruisco una nuova componente connessa. nel caso si "scontrino" applico il minimo tra le due pedine int main(){ ifstream fin("input.txt"); assert( fin ); // ofstream fout("output.txt"); assert( fout ); fin >> m >> n >> p; for(int i = 0; i < p; i++) { fin >> val_m; fin >> val_n; // fout << val_m << val_n << endl; //inizializzo le pedine a -1, così poi posso capire se la pedina è esplorata o meno dal segno S[val_m][val_n]=-1; } fin.close(); comp_connessa=0; punto_critico=0; //ho tenuto una colonna e una riga vuota, mi dava segmentation fault quando andava a ricercare sugli adiacenti for (int i=1; i<=m; i++) for (int j=1; j<=n; j++) { if (S[i][j]<0) { //se non ho adiacenti nei punti già passati, aggiungo una componente connessa if ((S[i-1][j] == 0 )&& (S[i][j-1]== 0)) comp_connessa++; S[i][j]=comp_connessa; if (S[i+1][j]<0 ) S[i+1][j]=comp_connessa; if (S[i][j+1]<0 ) S[i][j+1]=comp_connessa; else if (S[i][j+1]>0) S[i][j+1]=S[i][j]=min(S[i][j-1],S[i][j+1]); } else if (S[i][j]>0) { if (S[i-1][j]>0 ) { //se ho un numero maggiore nel punto che sto considerando e si "scontra" con un numero di comp. connessa diverso, aggiungo un punto critico punto_critico++; S[i-1][j]=min(S[i-1][j],S[i][j]); } // if (S[i][j+1]<0) // S[i][j+1]=S[i][j]; } } ofstream fout("output.txt"); assert( fout ); fout << comp_connessa << endl; fout << punto_critico << endl; fout.close(); return 0; }