Pagini recente »
Diferențe pentru runda/adunare/clasament între reviziile 32 și 31
|
Monitorul de evaluare
|
Borderou de evaluare (job #288045)
|
so2022-faza_pe_parcare
|
Cod sursă (job #756074)
Cod sursă (job
#756074)
#include <iostream>
#include <fstream>
#define N_MAX 501
using namespace std;
ifstream in("hex.in");
ofstream out("hex.out");
int colors[N_MAX][N_MAX], n;
int parent[N_MAX*N_MAX], sizeSet[N_MAX*N_MAX];
int lin[] = {0, -1, 0, 1, -1, 1}, col[] = {-1, 0, 1, 0, 1, -1};
int find (int x){
if (x == parent[x])
return x;
return parent[x] = find(parent[x]);
}
bool unite (int x, int y, bool ok){
int setX, setY, i;
setX = find(x);
setY = find(y);
if (sizeSet[setX] < sizeSet[setY])
swap (setX, setY);
if (setX != setY){
sizeSet[setX] += sizeSet[setY];
parent[setY] = setX;
if (ok)
sizeSet[setX]++;
}
if (sizeSet[setX] >= n+2)
return true;
return false;
}
bool verif(int x, int y, int color){
if (color == 1){ // albastru - verticala
if (x == 1 || x == n)
return true;
}
else if (color == 2){
if (y == 1 || y == n)
return true;
}
return false;
}
int main (){
int x, y, idx1;
bool ok = false, rez = false;
in >> n;
for (int i=1; i<=n*n; ++i){
in >> x >> y;
idx1 = (x-1) * n + y;
parent[idx1] = idx1;
sizeSet[idx1] = 1;
if (i % 2 == 0){
colors[x][y] = 1;
}
else{ // rosul- pe laterala
colors[x][y] = 2;
}
ok = verif(x, y, colors[x][y]);
for (int k=0; k<6; ++k){
int veciniX, veciniY, idx2;
veciniX = x + lin[k];
veciniY = y + col[k];
idx2 = (veciniX-1) * n + veciniY;
if (colors[veciniX][veciniY] == colors[x][y]){
rez = unite(idx1, idx2, ok);
}
}
if (rez == true){
out << i;
return 0;
}
}
return 0;
}