Pagini recente »
Monitorul de evaluare
|
Monitorul de evaluare
|
Istoria paginii runda/test_vectori
|
Monitorul de evaluare
|
Cod sursă (job #756082)
Cod sursă (job
#756082)
#include <iostream>
#include <fstream>
#include <bitset>
#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];
bitset <N_MAX*N_MAX> blueUp = 0;
bitset <N_MAX*N_MAX> blueDown = 0;
bitset <N_MAX*N_MAX> redLeft = 0;
bitset <N_MAX*N_MAX> redRight = 0;
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, int color){
int setX, setY;
setX = find(x);
setY = find(y);
if (setX != setY){
parent[setY] = setX;
if (color == 1){
if (blueUp[setX] == 0){
blueUp[setX] = blueUp[setY];
blueUp[setY] = 0;
}
if (blueDown[setX] == 0){
blueDown[setX] = blueDown[setY];
blueDown[setY] = 0;
}
}
if (color == 2){
if (redLeft[setX] == 0){
redLeft[setX] = redLeft[setY];
redLeft[setY] = 0;
}
if (redRight[setX] == 0){
redRight[setX] = redRight[setY];
redRight[setY] = 0;
}
}
}
if(blueUp[setX] == 1 && blueDown[setX] == 1)
return true;
if (redLeft[setX] == 1 && redRight[setX] == 1)
return true;
return false;
}
int main (){
int x, y, idx1, idx2, veciniX, veciniY;
bool rez = false;
in >> n;
for (int i=1; i<=n*n; ++i){
in >> x >> y;
idx1 = (x-1) * n + y;
parent[idx1] = idx1;
if (i % 2 == 0){ // ALBASTRU
colors[x][y] = 1;
if (x == 1)
blueUp[idx1] = 1;
else if (x == n)
blueDown[idx1] = 1;
}
else{ // ROSU
colors[x][y] = 2;
if (y == 1)
redLeft[idx1] = 1;
else if (y == n)
redRight[idx1] = 1;
}
for (int k=0; k<6; ++k){
veciniX = x + lin[k];
veciniY = y + col[k];
if (colors[veciniX][veciniY] == colors[x][y]){ // chiar am ceva acolo
idx2 = (veciniX-1) * n + veciniY;
rez = unite(idx1, idx2, colors[x][y]);
}
}
if (rez == true){
out << i;
return 0;
}
}
cout << '\n';
for (int i=1; i<=9; ++i)
cout << i << " " << blueUp[i] << ' ' << blueDown[i] << ' ' << redLeft[i] << ' ' << redRight[i] << '\n';
cout << '\n';
for (int i=1; i<=n; ++i){
for (int j=1; j<=n; ++j)
cout << colors[i][j];
cout << '\n';
}
return 0;
}