int result = 0x7FFFFFFF;
while (!q.empty()) {
int d = -q.top().first;
int r = q.top().second / N;
int c = q.top().second % N;
q.pop();
if (d != D[r][c]) {
continue;
}
int dist = abs(N - 1 - r) + abs(N - 1 - c);
if (dist <= 2) {
result = min(result, d + dist * T);
}
for (int i = 0; i < sizeof(dr) / sizeof(int); i++) {
int nr = r + dr[i];
int nc = c + dc[i];
if (nr < 0 || nr >= N || nc < 0 || nc >= N ||
D[nr][nc] < d + A[nr][nc] + 3 * T) {
continue;
}
D[nr][nc] = d + A[nr][nc] + 3 * T;
q.push(make_pair(-D[nr][nc], nr * N + nc));
}
}
cout << result << endl;