// zadanie Potworzyca
// rozwiazanie wzorcowe -- Eryk Kopczynski

#include <stdio.h>
#include <queue>

using namespace std;

#define MAXY 500
#define MAXX 500

int X, Y, H;

int plat[MAXY][MAXX];

int tim[MAXY][MAXX];

priority_queue<pair<int, pair<int, int>>> q;

#define INF 1000000000

int abs(int i) { return i>0?i:-i; }
int main() {
  scanf("%d%d%d", &Y, &X, &H);
  for(int y=0; y<Y; y++) for(int x=0; x<X; x++) 
    scanf("%d", &plat[y][x]);
  for(int y=0; y<Y; y++) for(int x=0; x<X; x++) 
    tim[y][x] = INF;
  q.push(make_pair(0, make_pair(0, 0)));
  while(!q.empty()) {
    auto z = q.top(); q.pop();
    int x = z.second.first;
    int y = z.second.second;
    int t = -z.first;
    if(0) printf("%d %d %d\n", x, y, t);
    if(tim[y][x] != INF) continue;
    tim[y][x] = t;
    for(int dy=-2; dy<=2; dy++) for(int dx=-2; dx<=2; dx++) {
      int ay = y+dy, ax=x+dx;
      if(ay<0 || ax<0 || ay>=Y || ax>=X) continue;
      int nt = abs(plat[y][x] - plat[ay][ax]);
      nt -= H; if(nt<0) nt=0;
      nt++;
      q.push(make_pair(-t-nt, make_pair(ax,ay)));
      }
    }
  /* if(0) for(int y=0; y<Y; y++) {
    for(int x=0; x<X; x++) printf("%3d:%3d ", plat[y][x], tim[y][x]); printf("\n");
    } */
  printf("%d\n", tim[Y-1][X-1]);
  return 0;
  }
