#include <bits/stdc++.h>
using namespace std;
// N x N matrix
#define N 6
// Function to check if cell (i, j) is a valid cell or not
bool isValid(int i, int j)
{
return (i >= 0 && i < N && j >= 0 && j < N);
}
// Find length of longest path starting from cell (i, j) formed by
// adjacent numbers in the matrix
int findLongestPath(int mat[N][N], int i, int j)
{
// if the cell is invalid
if (!isValid (i, j))
return 0;
// to store length of path starting (i, j)
int len = 0;
// recurse top cell if its value is +1 of value at (i, j)
if (i > 0 && mat[i - 1][j] - mat[i][j] == 1)
len = findLongestPath(mat, i - 1, j);
// recurse right cell if its value is +1 of value at (i, j)
if (j + 1 < N && mat[i][j + 1] - mat[i][j] == 1)
len = findLongestPath(mat, i, j + 1);
// recurse bottom cell if its value is +1 of value at (i, j)
if (i + 1 < N && mat[i + 1][j] - mat[i][j] == 1)
len = findLongestPath(mat, i + 1, j);
// recurse left cell if its value is +1 of value at (i, j)
if (j > 0 && mat[i][j - 1] - mat[i][j] == 1)
len = findLongestPath(mat, i, j - 1);
// note that as matrix contains all distinct elements,
// there is only one path possible from current cell
// return length of path starting from (i, j)
return 1 + len;
}
// main function
int main()
{
int mat[N][N] =
{
{ 10, 13, 14, 21, 23 },
{ 11, 9, 22, 2, 3 },
{ 12, 8, 1, 5, 4 },
{ 15, 24, 7, 6, 20 },
{ 16, 17, 18, 19, 25 }
};
// stores the length of longest path found so far
int result = 1;
// from each cell (i, j), find the longest path starting from it
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
result = max(result, findLongestPath(mat, i, j));
// print the length of longest path
cout << "Length of longest sequence is " << result;
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgovLyBOIHggTiBtYXRyaXgKI2RlZmluZSBOIDYKCi8vIEZ1bmN0aW9uIHRvIGNoZWNrIGlmIGNlbGwgKGksIGopIGlzIGEgdmFsaWQgY2VsbCBvciBub3QKYm9vbCBpc1ZhbGlkKGludCBpLCBpbnQgaikKewoJcmV0dXJuIChpID49IDAgJiYgaSA8IE4gJiYgaiA+PSAwICYmIGogPCBOKTsKfQoKLy8gRmluZCBsZW5ndGggb2YgbG9uZ2VzdCBwYXRoIHN0YXJ0aW5nIGZyb20gY2VsbCAoaSwgaikgZm9ybWVkIGJ5ICAKLy8gYWRqYWNlbnQgbnVtYmVycyBpbiB0aGUgbWF0cml4CmludCBmaW5kTG9uZ2VzdFBhdGgoaW50IG1hdFtOXVtOXSwgaW50IGksIGludCBqKQp7CgkvLyBpZiB0aGUgY2VsbCBpcyBpbnZhbGlkCglpZiAoIWlzVmFsaWQgKGksIGopKQoJCXJldHVybiAwOwoJCgkvLyB0byBzdG9yZSBsZW5ndGggb2YgcGF0aCBzdGFydGluZyAoaSwgaikKCWludCBsZW4gPSAwOwoKCS8vIHJlY3Vyc2UgdG9wIGNlbGwgaWYgaXRzIHZhbHVlIGlzICsxIG9mIHZhbHVlIGF0IChpLCBqKQoJaWYgKGkgPiAwICYmIG1hdFtpIC0gMV1bal0gLSBtYXRbaV1bal0gPT0gMSkKCQlsZW4gPSBmaW5kTG9uZ2VzdFBhdGgobWF0LCBpIC0gMSwgaik7CgoJLy8gcmVjdXJzZSByaWdodCBjZWxsIGlmIGl0cyB2YWx1ZSBpcyArMSBvZiB2YWx1ZSBhdCAoaSwgaikKCWlmIChqICsgMSA8IE4gJiYgbWF0W2ldW2ogKyAxXSAtIG1hdFtpXVtqXSA9PSAxKQoJCWxlbiA9IGZpbmRMb25nZXN0UGF0aChtYXQsIGksIGogKyAxKTsKCgkvLyByZWN1cnNlIGJvdHRvbSBjZWxsIGlmIGl0cyB2YWx1ZSBpcyArMSBvZiB2YWx1ZSBhdCAoaSwgaikKCWlmIChpICsgMSA8IE4gJiYgbWF0W2kgKyAxXVtqXSAtIG1hdFtpXVtqXSA9PSAxKQoJCWxlbiA9IGZpbmRMb25nZXN0UGF0aChtYXQsIGkgKyAxLCBqKTsKCgkvLyByZWN1cnNlIGxlZnQgY2VsbCBpZiBpdHMgdmFsdWUgaXMgKzEgb2YgdmFsdWUgYXQgKGksIGopCglpZiAoaiA+IDAgJiYgbWF0W2ldW2ogLSAxXSAtIG1hdFtpXVtqXSA9PSAxKQoJCWxlbiA9IGZpbmRMb25nZXN0UGF0aChtYXQsIGksIGogLSAxKTsKCgkvLyBub3RlIHRoYXQgYXMgbWF0cml4IGNvbnRhaW5zIGFsbCBkaXN0aW5jdCBlbGVtZW50cywKCS8vIHRoZXJlIGlzIG9ubHkgb25lIHBhdGggcG9zc2libGUgZnJvbSBjdXJyZW50IGNlbGwKCQoJLy8gcmV0dXJuIGxlbmd0aCBvZiBwYXRoIHN0YXJ0aW5nIGZyb20gKGksIGopCglyZXR1cm4gMSArIGxlbjsKfQoKLy8gbWFpbiBmdW5jdGlvbgppbnQgbWFpbigpCnsKCWludCBtYXRbTl1bTl0gPSAKCXsgCgkJeyAxMCwgMTMsIDE0LCAyMSwgMjMgfSwKCQl7IDExLCAgOSwgMjIsICAyLCAgMyB9LAoJCXsgMTIsICA4LCAgMSwgIDUsICA0IH0sCgkJeyAxNSwgMjQsICA3LCAgNiwgMjAgfSwKCQl7IDE2LCAxNywgMTgsIDE5LCAyNSB9Cgl9OwoKCS8vIHN0b3JlcyB0aGUgbGVuZ3RoIG9mIGxvbmdlc3QgcGF0aCBmb3VuZCBzbyBmYXIKCWludCByZXN1bHQgPSAxOwoJCgkvLyBmcm9tIGVhY2ggY2VsbCAoaSwgaiksIGZpbmQgdGhlIGxvbmdlc3QgcGF0aCBzdGFydGluZyBmcm9tIGl0Cglmb3IgKGludCBpID0gMDsgaSA8IE47IGkrKykgCgkJZm9yIChpbnQgaiA9IDA7IGogPCBOOyBqKyspIAoJCQlyZXN1bHQgPSBtYXgocmVzdWx0LCBmaW5kTG9uZ2VzdFBhdGgobWF0LCBpLCBqKSk7CgoJLy8gcHJpbnQgdGhlIGxlbmd0aCBvZiBsb25nZXN0IHBhdGgKCWNvdXQgPDwgIkxlbmd0aCBvZiBsb25nZXN0IHNlcXVlbmNlIGlzICIgPDwgcmVzdWx0OwoKCXJldHVybiAwOwp9