Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- void Read(int &val) {
- val = 0; char c;
- do { c = getchar(); } while (!isdigit(c));
- while (isdigit(c)) { val = val * 10 + c - '0'; c = getchar(); }
- }
- typedef pair<int, int> ii;
- struct data {
- int u, v, x, y, val;
- data() {}; data(int u, int v, int x, int y, int val) : u(u), v(v), x(x), y(y), val(val) {};
- };
- const int N = 1004;
- int n, a[N][N];
- int h[4] = { -1, 0, 1, 0 }, c[4] = { 0, -1, 0, 1 };
- int numVer, ver[N][N][5];
- data Edge[2*N*N];
- vector<int> adj[2*N*N];
- void Build_Graph() {
- for (int u = 1; u <= n; ++u) for (int v = 1; v <= n; ++v) {
- for (int dir = 0; dir < 4; ++dir) {
- int x = u + h[dir], y = v + c[dir];
- if (x < 1 || x > n || y < 1 || y > n) continue;
- int rDir = (dir + 2) % 4;
- if (ver[x][y][rDir] != 0) ver[u][v][dir] = ver[x][y][rDir];
- else {
- ver[u][v][dir] = ++numVer;
- Edge[numVer] = data(u, v, x, y, abs(a[u][v] - a[x][y]));
- }
- }
- }
- for (int i = 1; i <= numVer; ++i) {
- int u = Edge[i].u, v = Edge[i].v;
- for (int dir = 0; dir < 4; ++dir) {
- int x = u + h[dir], y = v + c[dir];
- if (x < 1 || x > n || y < 1 || y > n) continue;
- if (x == Edge[i].x && y == Edge[i].y) continue;
- int Next = ver[u][v][dir];
- if ( abs(a[u][v] - a[x][y]) == Edge[i].val ) adj[i].push_back(Next);
- }
- int x = Edge[i].x, y = Edge[i].y;
- for (int dir = 0; dir < 4; ++dir) {
- int u = x + h[dir], v = y + c[dir];
- if (u < 1 || u > n || v < 1 || v > n) continue;
- if (u == Edge[i].u && v == Edge[i].v) continue;
- int Next = ver[x][y][dir];
- if ( abs(a[u][v] - a[x][y]) == Edge[i].val ) adj[i].push_back(Next);
- }
- }
- }
- bool vis[2*N*N], ok[N][N];
- vector<ii> vec;
- void DFS(int u) {
- vis[u] = true;
- int tmpX = Edge[u].u, tmpY = Edge[u].v;
- if (!ok[tmpX][tmpY]) {
- vec.push_back(ii(tmpX, tmpY));
- ok[tmpX][tmpY] = true;
- }
- tmpX = Edge[u].x, tmpY = Edge[u].y;
- if (!ok[tmpX][tmpY]) {
- vec.push_back(ii(tmpX, tmpY));
- ok[tmpX][tmpY] = true;
- }
- for (int v : adj[u]) {
- if (vis[v]) continue;
- //vis[v] = true;
- DFS(v);
- }
- }
- void sol() {
- Build_Graph();
- int res = 0;
- for (int i = 1; i <= numVer; ++i) {
- if (vis[i]) continue;
- DFS(i);
- res = max(res, (int) vec.size());
- for (ii u : vec) ok[u.first][u.second] = false;
- vec.clear();
- }
- cout << res << '\n';
- }
- int main() {
- freopen("input.txt", "r", stdin);
- Read(n);
- for (int i = 1; i <= n; ++i) for (int j = 1; j <= n; ++j) Read(a[i][j]);
- sol();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement