直接枚举每个点能达到的最远距离是多少。然后更新答案即可。
#include <iostream>
#include <cstring>
using namespace std;
const int N = 1e3 + 10;
const int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
int n, T;
int g[N][N];
int dfs(int sx, int sy)
{
int v = g[sx][sy];
int x = sx, y = sy;
int cnt = 0;
while (true)
{
bool flag = false;
for (int i = 0; i < 4; ++i)
{
int tx = x + dx[i], ty = y + dy[i];
if (g[tx][ty] == v + 1)
{
++cnt;
v += 1;
x = tx, y = ty;
flag = true;
break;
}
}
if (!flag)
break;
}
return cnt;
}
int main()
{
cin >> T;
for (int u = 1; u <= T; ++u)
{
cin >> n;
memset(g, 0, sizeof(g));
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= n; ++j)
cin >> g[i][j];
int maxv = 0, res = 0x3f3f3f3f;
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= n; ++j)
{
int v = dfs(i, j);
if (maxv < v)
maxv = v, res = g[i][j];
else if (maxv == v)
res = min(res, g[i][j]);
}
printf("Case #%d: %d %d\n", u, res, maxv + 1);
}
return 0;
}