#include <bits/stdc++.h>
using namespace std;
struct seg {
  int mi, ma, l, r;
  seg() { mi = ma = 0; }
} t[1000005 * 12];
struct st {
  int x, d, l, r;
  bool operator<(const st &B) const { return d < B.d; }
} a[1000005];
int N, M, rt, S, X, Y;
void init() {
  scanf("%d%d%d", &N, &X, &Y);
  for (int i = 1, x; i <= N; i++)
    for (int j = 1; j <= N; j++) {
      scanf("%d", &x);
      int d = 1e9, l = 1e9, r = -1e9;
      for (int x = i - 1; x <= i; x++)
        for (int y = j - 1, z; y <= j; y++)
          d = min(d, x * X + y * Y), z = -Y * x + X * y, l = min(l, z),
          r = max(r, z);
      a[++M].x = x, a[M].d = d, a[M].l = l, a[M].r = r;
    }
}
int Min(int &p, int L, int R, int l, int r) {
  if (!p) return 0;
  int x;
  if (l <= L && R <= r)
    x = t[p].mi;
  else if (r <= ((L + R) >> 1))
    x = Min(t[p].l, L, ((L + R) >> 1), l, r);
  else if (((L + R) >> 1) < l)
    x = Min(t[p].r, ((L + R) >> 1) + 1, R, l, r);
  else
    x = min(Min(t[p].l, L, ((L + R) >> 1), l, ((L + R) >> 1)),
            Min(t[p].r, ((L + R) >> 1) + 1, R, ((L + R) >> 1) + 1, r));
  return max(x, t[p].ma);
}
void Max(int &p, int L, int R, int l, int r, int x) {
  if (!p) p = ++S;
  if (l <= L && R <= r) {
    t[p].mi = max(t[p].mi, x), t[p].ma = max(t[p].ma, x);
    return;
  }
  if (r <= ((L + R) >> 1))
    Max(t[p].l, L, ((L + R) >> 1), l, r, x);
  else if (((L + R) >> 1) < l)
    Max(t[p].r, ((L + R) >> 1) + 1, R, l, r, x);
  else
    Max(t[p].l, L, ((L + R) >> 1), l, ((L + R) >> 1), x),
        Max(t[p].r, ((L + R) >> 1) + 1, R, ((L + R) >> 1) + 1, r, x);
  t[p].mi = max(t[p].ma, min(t[t[p].l].mi, t[t[p].r].mi));
}
void doit() {
  sort(a + 1, a + M + 1);
  long long ans = 0;
  for (int i = 1; i <= M; i++) {
    ans += max(a[i].x - Min(rt, -2e7, 2e7, a[i].l, a[i].r - 1), 0);
    Max(rt, -2e7, 2e7, a[i].l, a[i].r - 1, a[i].x);
  }
  cout << ans << endl;
}
int main() {
  init();
  doit();
  return 0;
}
