#include <bits/stdc++.h>
const int N = 12;
const int dx[4] = {-1, 0, 1, 0};
const int dy[4] = {0, -1, 0, 1};
int n, m, d[N][N], q[N * N][2], sx, sy, q1, q2, v[N][N], x, y;
char a[N][N], b[N][N];
struct edge {
  int p, pre, cap;
} ed[N * N * N * N * 2];
int la[N * N * 2], num[N * N * 2], le[N * N * 2], ee, ns, nt;
int dfs(int x, int fx) {
  if (x == nt) return fx;
  int sum = 0, del;
  for (int j = la[x]; j > -1; j = ed[j].pre)
    if (le[x] == le[ed[j].p] + 1 && ed[j].cap > 0) {
      if (ed[j].cap > fx)
        del = fx;
      else
        del = ed[j].cap;
      del = dfs(ed[j].p, del);
      if (del == 0) continue;
      sum += del;
      fx -= del;
      ed[j].cap -= del;
      ed[j ^ 1].cap += del;
      if (fx == 0) return sum;
    }
  if (le[ns] >= nt) return sum;
  if (sum == 0) {
    num[le[x]]--;
    if (num[le[x]] == 0) le[ns] = nt;
    le[x]++;
    num[le[x]]++;
  }
  return sum;
}
void add(int x, int y, int ca) {
  ee++;
  ed[ee].pre = la[x];
  ed[ee].p = y;
  ed[ee].cap = ca;
  la[x] = ee;
}
int t;
int main() {
  scanf("%d%d", &n, &t);
  for (int i = 0; i < n; i++) scanf("%s", a[i]);
  for (int i = 0; i < n; i++) {
    scanf("%s", b[i]);
    for (int j = 0; j < n; j++)
      if (b[i][j] == 'Z') {
        sx = i;
        sy = j;
      }
  }
  q1 = 0;
  q2 = 1;
  q[1][0] = sx;
  q[1][1] = sy;
  memset(d, -1, sizeof(d));
  d[sx][sy] = 0;
  while (q1 < q2) {
    x = q[++q1][0];
    y = q[q1][1];
    for (int k = 0; k < 4; k++)
      if (x + dx[k] >= 0 && x + dx[k] < n && y + dy[k] >= 0 && y + dy[k] < n &&
          d[x + dx[k]][y + dy[k]] == -1 && a[x + dx[k]][y + dy[k]] != 'Y') {
        d[x + dx[k]][y + dy[k]] = d[x][y] + 1;
        q[++q2][0] = x + dx[k];
        q[q2][1] = y + dy[k];
      }
  }
  memset(la, -1, sizeof(la));
  ee = -1;
  ns = n * n * 2 + 1;
  nt = ns + 1;
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++)
      if (a[i][j] >= '1' && a[i][j] <= '9') {
        memset(v, -1, sizeof(v));
        q1 = 0;
        q2 = 1;
        q[1][0] = i;
        q[1][1] = j;
        v[i][j] = 0;
        while (q1 < q2) {
          x = q[++q1][0];
          y = q[q1][1];
          if (v[x][y] > t) continue;
          if (b[x][y] >= '1' && b[x][y] <= '9') {
            add(i * n + j + 1, x * n + y + 1 + n * n, 100000);
            add(x * n + y + 1 + n * n, i * n + j + 1, 0);
          }
          if (v[x][y] == d[x][y]) continue;
          for (int k = 0; k < 4; k++)
            if (x + dx[k] >= 0 && x + dx[k] < n && y + dy[k] >= 0 &&
                y + dy[k] < n && v[x + dx[k]][y + dy[k]] == -1 &&
                a[x + dx[k]][y + dy[k]] != 'Y')
              if (d[x + dx[k]][y + dy[k]] == -1 ||
                  d[x + dx[k]][y + dy[k]] > v[x][y] + 1 ||
                  d[x + dx[k]][y + dy[k]] == v[x][y] + 1 &&
                      b[x + dx[k]][y + dy[k]] >= '1' &&
                      b[x + dx[k]][y + dy[k]] <= '9') {
                v[x + dx[k]][y + dy[k]] = v[x][y] + 1;
                q[++q2][0] = x + dx[k];
                q[q2][1] = y + dy[k];
              }
        }
      }
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++) {
      if (a[i][j] >= '1' && a[i][j] <= '9') {
        add(ns, i * n + j + 1, a[i][j] - '0');
        add(i * n + j + 1, ns, 0);
      }
      if (b[i][j] >= '1' && b[i][j] <= '9') {
        add(i * n + j + 1 + n * n, nt, b[i][j] - '0');
        add(nt, i * n + j + 1 + n * n, 0);
      }
    }
  memset(le, 0, sizeof(le));
  memset(num, 0, sizeof(num));
  num[0] = nt;
  int del = 0;
  while (le[ns] < nt) del += dfs(ns, 100000);
  printf("%d\n", del);
}
