#include <bits/stdc++.h>
using namespace std;
int dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};
int total = 0, p[20000], n, t, lf[20][20], rg[20][20], d[20][20],
    poison[20][20], q[200000], dist[20000];
string a[20], b[20];
struct edge {
  int a, b, c, f;
};
vector<edge> e;
vector<int> g[20000];
void add_edge(int a, int b, int c) {
  edge e1 = {a, b, c, 0};
  g[a].push_back((int)e.size());
  e.push_back(e1);
  edge e2 = {b, a, 0, 0};
  g[b].push_back((int)e.size());
  e.push_back(e2);
}
bool bfs() {
  for (int i = 0; i <= total; ++i) dist[i] = -1;
  dist[0] = 0;
  int l = 0, r = 0;
  q[r++] = 0;
  while (l < r) {
    int v = q[l++];
    for (int i = 0; i < (int)g[v].size(); ++i) {
      int id = g[v][i], to = e[id].b;
      if (dist[to] == -1 && e[id].c > e[id].f) {
        dist[to] = dist[v] + 1;
        q[r++] = to;
      }
    }
  }
  return dist[total] != -1;
}
int dfs(int v, int flow) {
  if (v == total || !flow) return flow;
  for (int &i = p[v]; i < (int)g[v].size(); ++i) {
    int id = g[v][i], to = e[id].b;
    if (dist[to] != dist[v] + 1 || e[id].c <= e[id].f) continue;
    int push = dfs(to, min(flow, e[id].c - e[id].f));
    if (push) {
      e[id].f += push;
      e[id ^ 1].f -= push;
      return push;
    }
  }
  return 0;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cin >> n >> t;
  for (int i = 0; i < n; ++i) cin >> a[i];
  for (int i = 0; i < n; ++i) cin >> b[i];
  int reactX = 0, reactY = 0;
  for (int i = 0; i < n; ++i)
    for (int j = 0; j < n; ++j)
      if (a[i][j] == 'Z') reactX = i, reactY = j;
  int l = 0, r = 0;
  q[r++] = reactX;
  q[r++] = reactY;
  for (int i = 0; i < n; ++i)
    for (int j = 0; j < n; ++j) poison[i][j] = 1000000001;
  poison[reactX][reactY] = 0;
  while (l < r) {
    int x = q[l++];
    int y = q[l++];
    for (int i = 0; i < 4; ++i) {
      int x2 = x + dx[i];
      int y2 = y + dy[i];
      if (x2 >= 0 && x2 < n && y2 >= 0 && y2 < n &&
          poison[x2][y2] == 1000000001 && a[x2][y2] >= '0' &&
          a[x2][y2] <= '9') {
        poison[x2][y2] = poison[x][y] + 1;
        q[r++] = x2;
        q[r++] = y2;
      }
    }
  }
  int cnt = 0, cnt2 = 0;
  for (int i = 0; i < n; ++i)
    for (int j = 0; j < n; ++j)
      if (a[i][j] >= '0' && a[i][j] <= '9') lf[i][j] = ++cnt;
  total += cnt;
  for (int i = 0; i < n; ++i)
    for (int j = 0; j < n; ++j)
      if (b[i][j] >= '0' && b[i][j] <= '9') rg[i][j] = ++cnt2;
  total += cnt2 + 1;
  for (int i = 0; i < n; ++i)
    for (int j = 0; j < n; ++j)
      if (a[i][j] >= '0' && a[i][j] <= '9') {
        for (int k = 0; k < n; ++k)
          for (int l = 0; l < n; ++l) d[k][l] = -1;
        d[i][j] = 0;
        l = r = 0;
        q[r++] = i;
        q[r++] = j;
        add_edge(lf[i][j], cnt + rg[i][j], 1000000001);
        while (l < r) {
          int x = q[l++];
          int y = q[l++];
          if (d[x][y] >= t || d[x][y] >= poison[x][y]) continue;
          for (int k = 0; k < 4; ++k) {
            int x2 = x + dx[k];
            int y2 = y + dy[k];
            if (x2 >= 0 && x2 < n && y2 >= 0 && y2 < n && d[x2][y2] == -1 &&
                a[x2][y2] >= '0' && a[x2][y2] <= '9') {
              d[x2][y2] = d[x][y] + 1;
              if (d[x2][y2] <= min(t, poison[x2][y2]) && b[x2][y2] >= '0' &&
                  b[x2][y2] <= '9')
                add_edge(lf[i][j], cnt + rg[x2][y2], 1000000001);
              q[r++] = x2;
              q[r++] = y2;
            }
          }
        }
      }
  for (int i = 0; i < n; ++i)
    for (int j = 0; j < n; ++j) {
      if (lf[i][j] != 0) add_edge(0, lf[i][j], a[i][j] - '0');
      if (rg[i][j] != 0) add_edge(cnt + rg[i][j], total, b[i][j] - '0');
    }
  int ans = 0;
  while (1) {
    if (!bfs()) break;
    for (int i = 0; i <= total; ++i) p[i] = 0;
    while (int push = dfs(0, 1000000001)) ans += push;
  }
  cout << ans;
}
