#include <bits/stdc++.h>
using namespace std;
struct arc {
  int f, s, c, prev;
} arr[500005];
int beg[8005], kol = 0;
void add_arc(int f, int s, int cap) {
  arr[kol].f = f;
  arr[kol].s = s;
  arr[kol].c = cap;
  arr[kol].prev = beg[f];
  beg[f] = kol++;
  arr[kol].f = s;
  arr[kol].s = f;
  arr[kol].c = 0;
  arr[kol].prev = beg[s];
  beg[s] = kol++;
}
char buf[12][12];
char tmp[12][12];
char buf2[12][12];
int dx[] = {1, 0, -1, 0};
int dy[] = {0, -1, 0, 1};
int d[8005];
int tbeg[8005];
bool BFS(int f, int s) {
  memset(d, -1, sizeof d);
  d[f] = 0;
  queue<int> Q;
  Q.push(f);
  while (!Q.empty()) {
    int cur = Q.front();
    Q.pop();
    for (int i = beg[cur]; i != -1; i = arr[i].prev) {
      if (d[arr[i].s] == -1 && arr[i].c) {
        d[arr[i].s] = d[cur] + 1;
        Q.push(arr[i].s);
      }
    }
  }
  memcpy(tbeg, beg, sizeof beg);
  return d[s] != -1;
}
int DFS(int cur, int last, int mx) {
  if (cur == last) {
    return mx;
  }
  int ret = 0;
  for (int &i = tbeg[cur]; i != -1; i = arr[i].prev) {
    if (d[arr[i].s] == d[cur] + 1) {
      int tec = DFS(arr[i].s, last, min(mx, arr[i].c));
      arr[i].c -= tec;
      arr[i ^ 1].c += tec;
      mx -= tec;
      ret += tec;
      if (!mx) {
        break;
      }
    }
  }
  return ret;
}
int max_flow(int f, int s) {
  int ret = 0;
  while (BFS(f, s)) {
    ret += DFS(f, s, 1000000000);
  }
  return ret;
}
int main() {
  memset(beg, -1, sizeof beg);
  int n, t;
  cin >> n >> t;
  for (int i = 0; i < n; i++) {
    cin >> buf[i];
  }
  for (int i = 0; i < n; i++) {
    cin >> buf2[i];
  }
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      if (buf[i][j] >= '0' && buf[i][j] <= '9') {
        add_arc(0, i * n + j + 1, buf[i][j] - '0');
      }
      if (buf2[i][j] >= '0' && buf2[i][j] <= '9') {
        add_arc(i * n + j + 1, 7000 + i * n + j + 1, 1000000000);
        add_arc(7000 + i * n + j + 1, 8000, buf2[i][j] - '0');
      }
    }
  }
  for (int T = 0; T < t; T++) {
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < n; j++) {
        if (buf[i][j] >= '0' && buf[i][j] <= '9') {
          add_arc((T + 1) * 100 + i * n + j + 1, 7000 + i * n + j + 1,
                  1000000000);
          for (int k = 0; k < 4; k++) {
            int nx = i + dx[k], ny = j + dy[k];
            if (0 <= nx && nx < n && 0 <= ny && ny < n && buf[nx][ny] >= '0' &&
                buf[nx][ny] <= '9') {
              add_arc(T * 100 + i * n + j + 1, (T + 1) * 100 + nx * n + ny + 1,
                      1000000000);
            }
          }
        }
      }
    }
    memcpy(tmp, buf, sizeof buf);
    for (int i = 0; i < n; i++) {
      for (int j = 0; j < n; j++) {
        if (buf[i][j] == 'Z') {
          for (int k = 0; k < 4; k++) {
            int nx = i + dx[k], ny = j + dy[k];
            if (0 <= nx && nx < n && 0 <= ny && ny < n && buf[nx][ny] >= '0' &&
                buf[nx][ny] <= '9') {
              tmp[nx][ny] = 'Z';
            }
          }
        }
      }
    }
    memcpy(buf, tmp, sizeof buf);
  }
  printf("%d\n", max_flow(0, 8000));
  return 0;
}
