Skip to content

Instantly share code, notes, and snippets.

@vkopichenko
Created March 3, 2019 20:13
Show Gist options
  • Save vkopichenko/b76bb33b23ddc8f601aac27c12637389 to your computer and use it in GitHub Desktop.
Save vkopichenko/b76bb33b23ddc8f601aac27c12637389 to your computer and use it in GitHub Desktop.
Ты с какого района?!
// http://dl.gsu.by/task.jsp?nid=1756324&cid=1105
// К области 5-9 (весна)\Область, 5 мая 2011, 4 - 8 кл\10 - "Ты с какого района?!" 103054 Вераксич, Коржик, Тимошков
#include "bits/stdc++.h"
using namespace std;
const int N = 100;
int districts[N*N] {0}; // счётчики районов
int dcount = 0;
int* waste = nullptr; // пустырь
int* row[N]; // ссылки на счётчики районов для текущего ряда домов
int main() {
int n, m;
cin >> n >> m;
for (int i = 0; i < n; ++i) {
for (int j = 0, *left = waste; j < m; left = row[j++]) {
int* top = row[j];
char c;
cin >> c;
if (c == '.') {
row[j] = waste;
continue;
}
int dom = c - '0';
if (left == waste && top == waste) {
// новый район
row[j] = &(districts[dcount++] = dom);
} else if (left == waste) {
row[j] = top;
*top += dom;
} else if (top == waste || top == left) {
row[j] = left;
*left += dom;
} else {
// слияние районов, левый поглощает верхний
row[j] = left;
*left += *top + dom;
*top = 0;
// теперь нужно заменить ссылки в ряду на поглощённый район
for (int k = 0; k < m; ++k) if (row[k] == top) row[k] = left;
}
}
cin.ignore(1, '\n'); // перевод строки
}
int mx = *max_element(districts, districts + dcount);
cout << mx;
}
@vkopichenko
Copy link
Author

http://dl.gsu.by/task.jsp?nid=1756324&cid=1105
К области 5-9 (весна)\Область, 5 мая 2011, 4 - 8 кл\10 - "Ты с какого района?!" 103054 Вераксич, Коржик, Тимошков

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment