#include #include using namespace std; #define MAX_N 2000 #define MAX_M 2000 #define EMPTY 0 #define FULL 1 int M, N, P; int chess[MAX_M][MAX_N]; int group[MAX_M][MAX_N]; int nGroup = 0; int nPuntiCritici = 0; void converti(int i, int j, int gOld, int gNew) { if(group[i][j] == EMPTY) return; if(group[i][j] == gOld) { group[i][j] = gNew; // branch top if(i > 0) converti(i-1, j, gOld, gNew); // branch down if(i < M-1) converti(i+1, j, gOld, gNew); // branch sx if(j > 0) converti(i, j-1, gOld, gNew); // branch dx if(j < N-1) converti(i, j+1, gOld, gNew); } } int main(int argn, char** args) { ifstream fin("input.txt"); fin >> M >> N >> P; for(int i = 0; i < M; i++) for(int j = 0; j < N; j++) { chess[i][j] = EMPTY; group[i][j] = EMPTY; } int x, y; for(int i = 0; i < P; i++) { fin >> x >> y; chess[x-1][y-1] = FULL; } fin.close(); //cout << M << " " << N << " " << P << endl; // print chess /*for(int i = 0; i < M; i++) { for(int j = 0; j < N; j++) cout << chess[i][j]; cout << endl; } cout << "--" << endl;*/ int MN = M * N; for(int c = MN; c >= 0; c--) { int i = c / N; // row int j = c % N; // col if(chess[i][j] == FULL) { //cout << "(i,j) = (" << (i+1) << "," << (j+1) << ")" << endl; //cout << "gruppi = " << nGroup << endl; // controllo i vicini int gDx = EMPTY; int gDwn = EMPTY; // dx if(j < N-1) gDx = group[i][j+1]; // down if(i < M-1) gDwn = group[i+1][j]; // se sono entrambi vuoti if(gDx == EMPTY && gDwn == EMPTY) { // creo un nuovo gruppo group[i][j] = ++nGroup; } // se il gruppo sotto è segnato else if(gDx == EMPTY && gDwn != EMPTY) { // espando la connessione in questa casella group[i][j] = gDwn; } // se il gruppo a dx è segnato else if(gDx != EMPTY && gDwn == EMPTY) { // espando la connessione in questa casella group[i][j] = gDx; } else if(gDx != EMPTY && gDwn != EMPTY) { // espando la connessione in questa casella group[i][j] = gDx; // evito di andare in negativo if(gDx != gDwn) { //cout << "conn (i,j) = (" << (i+1) << "," << (j+1) << ")" << endl; // connetto i due gruppi, quindi i gruppi totali diminuiscono di 1 --nGroup; // converto il gruppo con id maggiore if(gDx < gDwn) converti(i+1, j, gDwn, gDx); else converti(i, j+1, gDx, gDwn); } } } } ofstream fout("output.txt"); fout << nGroup << endl << nPuntiCritici << endl; return 0; }