# PBinfo #601 – Dreptunghiuri – Rezolvare C++

Sursa: Codul lui Andrei
Limbaj: C++
Autor rezolvare: deivid

## Enunț

Cerința
Se consideră într-un reper cartezian n puncte cu coordonate pozitive. Prin fiecare punct se desenează o dreaptă verticală și una orizontală. Să se determine câte dreptunghiuri cu interioarele disjuncte s-au format prin intermediul acestor drepte şi al axelor de coordonate.

Date de intrare
Fișierul de intrare dreptunghiuri.in conține pe prima linie numărul n; următoarele n linii conțin câte două numere x y, reprezentând coordonatele punctelor.

Date de ieșire
Fișierul de ieșire dreptunghiuri.out va conține pe prima linie numărul C, reprezentând valoarea cerută.

Restricții și precizări

1 ≤ n ≤ 1000
coordonatele punctelor sunt numere întregi mai mici decât 1.000.000.000

Exemplu:
dreptunghiuri.in

4
1 0
3 4
4 2
1 2
dreptunghiuri.out

6
Explicație
Exemplul corespunde următorului caz:

## Cod sursă C++

```cpp
/*
	dreptel (si chiar punctele se pot suprapune)
	fie NrO = numarul de drepte orizontale si NrV = numarul de drepte verticale
	Atunci rezultatul este (NrO - 1) * (NrV - 1)
*/
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("dreptunghiuri.in");
ofstream fout("dreptunghiuri.out");
int n, x[1005], y[1005];
int main()
{
	fin >> n ;
	for(int i = 1 ; i <= n ; ++i)
		fin >> x[i] >> y[i];
	x[0] = 0; y[0] = 0; // axele de coordonate
	// pentru a afla cate drepte verticale diferite avem, determinam 
	// numarul de valori diferite din x[]. Pentru aceasta, sortam vectorul 
	// si numaram cate secvente de elemente egale exista
	//		Similar pentru dreptele orizontale
	for(int i = 0 ; i < n ; ++i)
		for(int j = i + 1; j <= n ; ++j)
			if(x[i] > x[j])
			{
				int aux = x[i]; x[i] = x[j] ; x[j] = aux;
			}
	int NrV = 1;
	for(int i = 1 ; i <= n ; ++i)
		if(x[i] !=x[i-1])
			NrV ++;
	for(int i = 0 ; i < n ; ++i)
		for(int j = i + 1; j <= n ; ++j)
			if(y[i] > y[j])
			{
				int aux = y[i]; y[i] = y[j] ; y[j] = aux;
			}
	int NrO = 1;
	for(int i = 1 ; i <= n ; ++i)
		if(y[i] !=y[i-1])
			NrO ++;
	fout << (NrV - 1) * (NrO - 1);
	return 0;
}
```

## Resurse

- [Pagina originală](https://codulluiandrei.ro/rezolvari/pbinfo/601)
- [Sursa C++](https://codulluiandrei.ro/rezolvari/pbinfo/601/cod.cpp)
- [Sursa pe GitHub](https://raw.githubusercontent.com/codulluiandrei/pbinfo/main/pbinfo-601/main.cpp)
- [Cursuri de informatică pentru BAC](https://codulluiandrei.ro/academia/info-curs/pachet-cpp/)
