class Solution {
public:
vector<vector<int>> mat;
int dx[8] = {-1, -1, -1, 0, 1, 1, 1, 0};
int dy[8] = {-1, 0, 1, 1, 1, 0, -1, -1};
unordered_map<int, int> hash;
int n, m;
void dfs(int x, int y) {
for (int i = 0; i < 8; i ++ ) {
int a = x, b = y;
int t = mat[x][y];
while (1) {
a += dx[i], b += dy[i];
if (a < 0 || a >= n || b < 0 || b >= m) break;
t = t * 10 + mat[a][b];
hash[t] ++ ;
}
}
}
bool check(int x) {
if (x < 2) return false;
for (int i = 2; i * i <= x; i ++ )
if (x % i == 0) return false;
return true;
}
int mostFrequentPrime(vector<vector<int>>& _mat) {
mat = _mat;
n = mat.size(), m = mat[0].size();
for (int i = 0; i < mat.size(); i ++ )
for (int j = 0; j < mat[0].size(); j ++ ) {
dfs(i, j);
}
int res = 0, val = -1;
for (auto [k, v]: hash)
if (k > 10 && check(k) && (res < v || ((res == v) && k > val))) {
res = v;
val = k;
}
if (val == -1) return -1;
return val;
}
};