#include <bits/stdc++.h>
using namespace std;
const int inf = 199999999;
const int maxn = 6600;
const int maxm = 66000;
int n, add, ans, s, t, low;
int hea[maxn], nex[maxm], vv[maxm], cap[maxm], flow[maxm];
int dis[maxn], arc[maxn], gap[maxn], pre[maxn];
inline bool relax(int &u) {
  for (int &e = arc[u]; e != -1; e = nex[e])
    if (dis[vv[e]] == dis[u] - 1 && cap[e] > flow[e]) {
      low = min(low, cap[e] - flow[e]);
      pre[vv[e]] = u;
      u = vv[e];
      if (u == t) {
        while (u != s) {
          u = pre[u];
          flow[arc[u]] += low;
          flow[arc[u] ^ 1] -= low;
        }
        ans += low;
        low = inf;
      }
      return true;
    }
  return false;
}
void sap(int n) {
  memset(flow, 0, sizeof(flow));
  memset(arc, -1, sizeof(arc));
  memset(dis, 0, sizeof(dis));
  memset(gap, 0, sizeof(gap));
  int u, e, mind;
  gap[0] = n;
  ans = 0;
  low = inf;
  u = s;
  pre[s] = s;
  while (dis[s] < n)
    if (!relax(u)) {
      mind = n;
      for (e = hea[u]; e != -1; e = nex[e])
        if (mind > dis[vv[e]] && cap[e] > flow[e]) {
          arc[u] = e;
          mind = dis[vv[e]];
        }
      int &tmp = dis[u];
      u = pre[u];
      if (gap[tmp] == 1) return;
      gap[tmp]--;
      tmp = mind + 1;
      gap[tmp]++;
    }
}
inline void adj(int a, int b, int c) {
  vv[add] = b;
  cap[add] = c;
  nex[add] = hea[a];
  hea[a] = add++;
  vv[add] = a;
  cap[add] = 0;
  nex[add] = hea[b];
  hea[b] = add++;
}
int nn, tt, tim[12][12];
int dx[] = {0, 0, 1, -1}, dy[] = {1, -1, 0, 0};
char aa[12][12], bb[12][12];
queue<int> q;
void bfs() {
  for (int i = 0; i < nn; ++i)
    for (int j = 0; j < nn; ++j) tim[i][j] = tt;
  int x = 0, y = 0;
  for (int i = 0; i < nn; ++i)
    for (int j = 0; j < nn; ++j)
      if (aa[i][j] == 'Z') x = i, y = j;
  q.push(x);
  q.push(y);
  tim[x][y] = 0;
  while (!q.empty()) {
    x = q.front();
    q.pop();
    y = q.front();
    q.pop();
    for (int i = 0; i < 4; ++i) {
      int xx = dx[i] + x, yy = dy[i] + y;
      if (xx < 0 || xx >= nn) continue;
      if (yy < 0 || yy >= nn) continue;
      if (aa[xx][yy] == 'Y') continue;
      if (tim[xx][yy] <= tim[x][y] + 1) continue;
      tim[xx][yy] = tim[x][y] + 1;
      q.push(xx);
      q.push(yy);
    }
  }
}
void init() {
  memset(hea, -1, sizeof(hea));
  add = 0;
  s = 0;
  t = 6210;
  for (int i = 0; i < nn; ++i)
    for (int j = 0; j < nn; ++j)
      if ('0' <= aa[i][j] && aa[i][j] <= '9')
        adj(s, i * nn + j + 1, aa[i][j] - '0');
  for (int i = 0; i < nn; ++i)
    for (int j = 0; j < nn; ++j)
      if ('0' <= bb[i][j] && bb[i][j] <= '9')
        adj((tt + 1) * nn * nn + i * nn + j + 1, t, bb[i][j] - '0');
  for (int i = 0; i < nn; ++i) {
    for (int j = 0; j < nn; ++j) {
      if (aa[i][j] == 'Y' || aa[i][j] == 'Z') continue;
      for (int k = 0; k <= tim[i][j]; ++k) {
        adj(k * nn * nn + i * nn + j + 1, (tt + 1) * nn * nn + i * nn + j + 1,
            1100);
        if (k == tim[i][j]) continue;
        for (int kk = 0; kk < 4; ++kk) {
          int ii = i + dx[kk], jj = j + dy[kk];
          if (ii < 0 || ii >= nn) continue;
          if (jj < 0 || jj >= nn) continue;
          if (aa[ii][jj] == 'Y' || aa[ii][jj] == 'Z') continue;
          if (tim[ii][jj] < k + 1) continue;
          adj(k * nn * nn + i * nn + j + 1,
              (k + 1) * nn * nn + ii * nn + jj + 1, 1100);
        }
      }
    }
  }
}
int main() {
  scanf("%d %d", &nn, &tt);
  for (int i = 0; i < nn; ++i) scanf("%s", aa[i]);
  for (int i = 0; i < nn; ++i) scanf("%s", bb[i]);
  bfs();
  init();
  sap(6211);
  printf("%d\n", ans);
  return 0;
}
