#include <bits/stdc++.h>
using namespace std;
template <class T>
T abs(T x) {
  return x > 0 ? x : -x;
}
int n;
int m;
int vx, vy;
int tree[(1 << 22) + 1];
int add[(1 << 22) + 1];
vector<pair<int, pair<int, int> > > u;
vector<pair<pair<int, int>, pair<int, int> > > w;
int g[1000][1000];
int p[1000][1000];
int q[1000][1000];
int get(int x, int l, int r, int lc, int rc) {
  if (r < lc || l > rc) return 2e9;
  if (l >= lc && r <= rc) return max(tree[x], add[x]);
  int s = (l + r) / 2;
  return max(
      min(get(x * 2 + 1, l, s, lc, rc), get(x * 2 + 2, s + 1, r, lc, rc)),
      add[x]);
}
int upd(int x, int l, int r, int lc, int rc, int z) {
  if (r < lc || l > rc) return max(tree[x], add[x]);
  if (l >= lc && r <= rc) {
    add[x] = max(add[x], z);
    return max(tree[x], add[x]);
  }
  int s = (l + r) / 2;
  tree[x] =
      min(upd(x * 2 + 1, l, s, lc, rc, z), upd(x * 2 + 2, s + 1, r, lc, rc, z));
  return max(tree[x], add[x]);
}
int main() {
  scanf("%d%d%d", &n, &vx, &vy);
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++) scanf("%d", &g[i][j]);
  if (vy < 0) {
    vy = -vy;
    for (int i = 0; i < n; i++)
      for (int j = 0; 2 * j < n; j++) swap(g[i][j], g[i][n - j - 1]);
  }
  if (vx < 0) {
    vx = -vx;
    for (int i = 0; 2 * i < n; i++)
      for (int j = 0; j < n; j++) swap(g[i][j], g[n - i - 1][j]);
  }
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++) {
      int a = vx * i + vy * j;
      int b = -vy * (i + 1) + vx * j;
      int c = -vy * i + vx * (j + 1) - 1;
      u.push_back(make_pair(a, make_pair(i, j)));
      w.push_back(make_pair(make_pair(b, 0), make_pair(i, j)));
      w.push_back(make_pair(make_pair(c, 1), make_pair(i, j)));
    }
  sort((u).begin(), (u).end());
  sort((w).begin(), (w).end());
  int r = 0;
  for (int i = 0; i < ((int)(w).size()); i++) {
    if (i == 0 || w[i - 1].first.first != w[i].first.first) r++;
    if (w[i].first.second == 0)
      p[w[i].second.first][w[i].second.second] = r - 1;
    else
      q[w[i].second.first][w[i].second.second] = r - 1;
  }
  memset(tree, 0, sizeof(tree));
  memset(add, 0, sizeof(add));
  long long ans = 0;
  for (int k = 0; k < ((int)(u).size()); k++) {
    int i = u[k].second.first;
    int j = u[k].second.second;
    int a = g[i][j];
    int b = p[i][j];
    int c = q[i][j];
    int d = get(0, 0, r - 1, b, c);
    if (d < a) {
      ans += a - d;
      upd(0, 0, r - 1, b, c, a);
    }
  }
  cout << ans << endl;
  return 0;
}
