Pagini recente »
Istoria paginii runda/2020-05-09-clasa-5-concurs/clasament
|
Istoria paginii runda/2024-03-01-clasa-5-tema-28
|
Istoria paginii runda/2024-03-05-clasa-7-tema-24/clasament
|
Tema 19 clasele 11-12 2014/15
|
Cod sursă (job #501785)
Cod sursă (job
#501785)
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
int col[6] = {0, 1, 1, 0, -1, -1};
int row[6] = {-1, -1, 0, 1, 1, 0};
int mapa[510][510];
pair<int, int> p[510][510];
pair<int, int> min_red;
int n, i, j, curri, currj;
int max_grup[510][510];
pair<int, int> parent(pair<int, int> x){
int xi = x.fi;
int xj = x.se;
if(p[xi][xj] == x)
return x;
else {
p[xi][xj] = parent(p[xi][xj]);
return p[xi][xj];
}
}
int main(){
ifstream cin("hex.in");
ofstream cout("hex.out");
cin>>n;
for(i = 1;i<=n;i++)
for(j = 1;j<=n;j++)
p[i][j] = {i, j};
for(int pas=1;pas<=n*n;pas++){
cin>>i>>j;
//cout<<'\n';
min_red = p[i][j];
if(pas%2 == 1) {
mapa[i][j] = 1;
max_grup[i][j] = j;
for(int k =0;k<6;k++){
curri = i+ row[k];
currj = j + col[k];
// max_grup[i][j] = max(max_grup[i][j]);
// cout<<curri<<' '<<currj<<'\n';
if(curri > 0 && curri <= n && currj > 0 && currj <= n) {
max_grup[i][j] = max(max_grup[i][j], max_grup[curri][currj]);
if(mapa[curri][currj] == 1)
if(min_red.se >= parent(p[curri][currj]).se){
min_red = p[curri][currj];
}
}
}
//cout<<'\n';
//cout<<min_red.fi<<' '<<min_red.se<<'\n';
//cout<<'\n';
p[parent({i, j}).fi][parent({i, j}).se] = parent(min_red);
for(int k =0;k<6;k++){
curri = i+ row[k];
currj = j + col[k];
if(mapa[curri][currj] == 1)
p[parent({curri, currj}).fi][parent({curri, currj}).se] = parent(min_red);
}
if(max_grup[i][j] == n && p[i][j].se == 1){
cout<<pas;
return 0;
}
}
else {
mapa[i][j] = 2;
max_grup[i][j] = i;
for(int k =0;k<6;k++){
curri = i+ row[k];
currj = j + col[k];
// cout<<curri<<' '<<currj<<'\n';
if(curri > 0 && curri <= n && currj > 0 && currj <= n) {
max_grup[i][j] = max(max_grup[i][j], max_grup[curri][currj]);
if(mapa[curri][currj] == 2)
if(min_red.fi >= parent(p[curri][currj]).fi){
min_red = p[curri][currj];
}
}
}
//cout<<'\n';
//cout<<min_red.fi<<' '<<min_red.se<<'\n';
p[parent({i, j}).fi][parent({i, j}).se] = parent(min_red);
//cout<<'\n';
for(int k =0;k<6;k++){
curri = i+ row[k];
currj = j + col[k];
if(mapa[curri][currj] == 2)
p[parent({curri, currj}).fi][parent({curri, currj}).se] = parent(min_red);
}
if(max_grup[i][j] == n && p[i][j].fi == 1){
cout<<pas;
return 0;
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
cout<<mapa[i][j]<<' ';
cout<<'\n';
}
cout<<'\n';
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
cout<<p[i][j].fi<<p[i][j].se<<' ';
cout<<'\n';
}
return 0;
}