#include <bits/stdc++.h>
using namespace std;
const int M = 1005, inf = (int)1e9 + 7;
void Min(int &x, int y) {
  if (x > y) x = y;
}
void Max(int &x, int y) {
  if (x < y) x = y;
}
int n, vx, vy, v;
struct W {
  int dis, l, r, v;
  bool operator<(const W &a) const { return dis < a.dis; }
} A[M * M];
int sz;
int pl[M * M * 5], psz;
void ADD(int x, int y) {
  scanf("%d", &v);
  int dis = inf, l = inf, r = -inf;
  for (int i = x - 1; i <= x; i++)
    for (int j = y - 1; j <= y; j++) {
      Min(dis, j * vy + i * vx);
      Min(l, i * vy - j * vx);
      Max(r, i * vy - j * vx);
      pl[psz++] = i * vy - j * vx;
    }
  A[sz++] = (W){dis, l, r, v};
}
struct SEGMENT {
  int val[M * M * 4], add[M * M * 4];
  void up(int p) { val[p] = min(val[p << 1], val[p << 1 | 1]); }
  void down(int p) {
    if (add[p]) {
      int ls = p << 1, rs = p << 1 | 1;
      Max(val[ls], add[p]), Max(add[ls], add[p]);
      Max(val[rs], add[p]), Max(add[rs], add[p]);
      add[p] = 0;
    }
  }
  void update(int L, int R, int p, int l, int r, int v) {
    if (L == l && R == r) {
      Max(add[p], v);
      Max(val[p], v);
      return;
    }
    down(p);
    int mid = (L + R) >> 1;
    if (mid >= r)
      update(L, mid, p << 1, l, r, v);
    else if (mid < l)
      update(mid + 1, R, p << 1 | 1, l, r, v);
    else
      update(L, mid, p << 1, l, mid, v),
          update(mid + 1, R, p << 1 | 1, mid + 1, r, v);
    up(p);
  }
  int query(int L, int R, int p, int l, int r) {
    if (L == l && R == r) return val[p];
    down(p);
    int mid = (L + R) >> 1;
    if (mid >= r)
      return query(L, mid, p << 1, l, r);
    else if (mid < l)
      return query(mid + 1, R, p << 1 | 1, l, r);
    else
      return min(query(L, mid, p << 1, l, mid),
                 query(mid + 1, R, p << 1 | 1, mid + 1, r));
  }
} T;
int main() {
  scanf("%d %d %d", &n, &vx, &vy);
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++) ADD(i, j);
  sort(A, A + sz);
  sort(pl, pl + psz), psz = unique(pl, pl + psz) - pl;
  long long ans = 0;
  for (int i = 0, l, r; i < sz; i++) {
    l = lower_bound(pl, pl + psz, A[i].l) - pl;
    r = lower_bound(pl, pl + psz, A[i].r) - pl - 1;
    ans += max(0, A[i].v - T.query(0, psz, 1, l, r));
    T.update(0, psz, 1, l, r, A[i].v);
  }
  cout << ans << endl;
  return 0;
}
