#include <bits/stdc++.h>
using namespace std;
bool isBorder(int r, int c, int rows, int cols) {
return r == 0 || r == rows - 1 || c == 0 || c == cols - 1;
}
int getExpectedValue(int idx) {
if (idx == 0) return 1;
return (idx % 2 == 1) ? 2 : 0;
}
int solution(vector<vector<int>>& matrix) {
int rows = matrix.size();
int cols = matrix[0].size();
int maxLen = 0;
// All 4 diagonal directions
vector<pair<int, int>> directions = {
{1, 1}, // ↘
{1, -1}, // ↙
{-1, 1}, // ↗
{-1, -1} // ↖
};
for (int r = 0; r < rows; ++r) {
for (int c = 0; c < cols; ++c) {
// Only start if the cell is 1 (pattern starts with 1)
if (matrix[r][c] != 1) continue;
for (auto& dir : directions) {
int len = 0;
int i = r, j = c;
while (i >= 0 && i < rows && j >= 0 && j < cols) {
if (matrix[i][j] != getExpectedValue(len)) break;
len++;
i += dir.first;
j += dir.second;
}
// Check if the last valid position was on the border
int last_i = r + dir.first * (len - 1);
int last_j = c + dir.second * (len - 1);
if (len > 0 && isBorder(last_i, last_j, rows, cols)) {
maxLen = max(maxLen, len);
}
}
}
}
return maxLen;
}
int main() {
vector<vector<int>> matrix = {
{0, 0, 1, 2},
{0, 2, 2, 2},
{2, 1, 0, 1}
};
cout << solution(matrix) << endl; // Output: 3
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgpib29sIGlzQm9yZGVyKGludCByLCBpbnQgYywgaW50IHJvd3MsIGludCBjb2xzKSB7CiAgICByZXR1cm4gciA9PSAwIHx8IHIgPT0gcm93cyAtIDEgfHwgYyA9PSAwIHx8IGMgPT0gY29scyAtIDE7Cn0KCmludCBnZXRFeHBlY3RlZFZhbHVlKGludCBpZHgpIHsKICAgIGlmIChpZHggPT0gMCkgcmV0dXJuIDE7CiAgICByZXR1cm4gKGlkeCAlIDIgPT0gMSkgPyAyIDogMDsKfQoKaW50IHNvbHV0aW9uKHZlY3Rvcjx2ZWN0b3I8aW50Pj4mIG1hdHJpeCkgewogICAgaW50IHJvd3MgPSBtYXRyaXguc2l6ZSgpOwogICAgaW50IGNvbHMgPSBtYXRyaXhbMF0uc2l6ZSgpOwogICAgaW50IG1heExlbiA9IDA7CgogICAgLy8gQWxsIDQgZGlhZ29uYWwgZGlyZWN0aW9ucwogICAgdmVjdG9yPHBhaXI8aW50LCBpbnQ+PiBkaXJlY3Rpb25zID0gewogICAgICAgIHsxLCAxfSwgICAvLyDihpgKICAgICAgICB7MSwgLTF9LCAgLy8g4oaZCiAgICAgICAgey0xLCAxfSwgIC8vIOKGlwogICAgICAgIHstMSwgLTF9ICAvLyDihpYKICAgIH07CgogICAgZm9yIChpbnQgciA9IDA7IHIgPCByb3dzOyArK3IpIHsKICAgICAgICBmb3IgKGludCBjID0gMDsgYyA8IGNvbHM7ICsrYykgewogICAgICAgICAgICAvLyBPbmx5IHN0YXJ0IGlmIHRoZSBjZWxsIGlzIDEgKHBhdHRlcm4gc3RhcnRzIHdpdGggMSkKICAgICAgICAgICAgaWYgKG1hdHJpeFtyXVtjXSAhPSAxKSBjb250aW51ZTsKCiAgICAgICAgICAgIGZvciAoYXV0byYgZGlyIDogZGlyZWN0aW9ucykgewogICAgICAgICAgICAgICAgaW50IGxlbiA9IDA7CiAgICAgICAgICAgICAgICBpbnQgaSA9IHIsIGogPSBjOwogICAgICAgICAgICAgICAgd2hpbGUgKGkgPj0gMCAmJiBpIDwgcm93cyAmJiBqID49IDAgJiYgaiA8IGNvbHMpIHsKICAgICAgICAgICAgICAgICAgICBpZiAobWF0cml4W2ldW2pdICE9IGdldEV4cGVjdGVkVmFsdWUobGVuKSkgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgbGVuKys7CiAgICAgICAgICAgICAgICAgICAgaSArPSBkaXIuZmlyc3Q7CiAgICAgICAgICAgICAgICAgICAgaiArPSBkaXIuc2Vjb25kOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBsYXN0IHZhbGlkIHBvc2l0aW9uIHdhcyBvbiB0aGUgYm9yZGVyCiAgICAgICAgICAgICAgICBpbnQgbGFzdF9pID0gciArIGRpci5maXJzdCAqIChsZW4gLSAxKTsKICAgICAgICAgICAgICAgIGludCBsYXN0X2ogPSBjICsgZGlyLnNlY29uZCAqIChsZW4gLSAxKTsKICAgICAgICAgICAgICAgIGlmIChsZW4gPiAwICYmIGlzQm9yZGVyKGxhc3RfaSwgbGFzdF9qLCByb3dzLCBjb2xzKSkgewogICAgICAgICAgICAgICAgICAgIG1heExlbiA9IG1heChtYXhMZW4sIGxlbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIG1heExlbjsKfQoKaW50IG1haW4oKSB7CiAgICB2ZWN0b3I8dmVjdG9yPGludD4+IG1hdHJpeCA9IHsKICAgICAgICB7MCwgMCwgMSwgMn0sCiAgICAgICAgezAsIDIsIDIsIDJ9LAogICAgICAgIHsyLCAxLCAwLCAxfQogICAgfTsKCiAgICBjb3V0IDw8IHNvbHV0aW9uKG1hdHJpeCkgPDwgZW5kbDsgLy8gT3V0cHV0OiAzCiAgICByZXR1cm4gMDsKfQo=