int ans = 0;
struct node {
int x, y;
};
int dir[4][2] = {1, 0, 0, 1, -1, 0, 0, -1};
void dfs(vector<vector<int>> &grid, int x, int y, int &temp) {
ans = max(ans, temp);
int n = grid.size(), m = grid[0].size();
for (int i = 0; i < 4; ++i) {
int xx = x + dir[i][0];
int yy = y + dir[i][1];
if (xx < 0 || yy < 0 || xx == n || yy == m || grid[xx][yy] == 0) continue;
int val = grid[xx][yy];
grid[xx][yy] = 0;
temp += val;
dfs(grid, xx, yy, temp);
temp -= val;
grid[xx][yy] = val;
}
}
int func(vector<vector<int>> &grid) {
int n = grid.size(), m = grid[0].size();
for (int i = 0; i < n; ++i) {
for (int j = 0; j < m; ++j) {
if (grid[i][j] == 0) continue;
int temp = grid[i][j];
grid[i][j] = 0;
dfs(grid, i, j, temp);
grid[i][j] = temp;
}
}
return ans;
}