#include <bits/stdc++.h>
using namespace std;
char A[12][12];
char B[12][12];
int n, t;
bool _dp[70][12][12][12][12];
bool dp[12][12][12][12];
int tim[12][12];
void setdp(int tt, int x, int y, int x0, int y0) {
  if (t >= 70) return;
  if (x < 0 || x >= n || y < 0 || y >= n) return;
  if (A[x][y] < '0' || A[x][y] > '9') return;
  if (tt > t + 1) return;
  if (_dp[tt][x][y][x0][y0]) return;
  if (tt > tim[x][y] && tim[x][y] != 0) return;
  if (tt == tim[x][y] && tim[x][y] != 0 && (B[x][y] > '9' || B[x][y] <= '0'))
    return;
  _dp[tt][x][y][x0][y0] = true;
  if (tt < tim[x][y]) {
    setdp(tt + 1, x, y, x0, y0);
    setdp(tt + 1, x + 1, y, x0, y0);
    setdp(tt + 1, x - 1, y, x0, y0);
    setdp(tt + 1, x, y + 1, x0, y0);
    setdp(tt + 1, x, y - 1, x0, y0);
  }
}
vector<vector<int> > G;
int F[210][210];
int E[210], H[210];
int C[210][210];
int pN[11][11];
int main() {
  cin >> n >> t;
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++) cin >> A[i][j];
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++) cin >> B[i][j];
  deque<pair<int, int> > q;
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++) tim[i][j] = -1;
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++)
      if (A[i][j] == 'Z') {
        tim[i][j] = 0;
        q.push_back(make_pair(i, j));
      }
  int di[] = {-1, 0, 1, 0};
  int dj[] = {0, -1, 0, 1};
  while (!q.empty()) {
    pair<int, int> p = q.front();
    q.pop_front();
    if (tim[p.first][p.second] >= t) continue;
    for (int d = 0; d <= 3; d++) {
      pair<int, int> np = make_pair(p.first + di[d], p.second + dj[d]);
      if (np.first >= 0 && np.first < n && np.second >= 0 && np.second < n &&
          A[np.first][np.second] >= '0' && A[np.first][np.second] <= '9' &&
          tim[np.first][np.second] == -1) {
        tim[np.first][np.second] = tim[p.first][p.second] + 1;
        q.push_back(np);
      }
    }
  }
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++)
      if (tim[i][j] == -1) tim[i][j] = t;
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++)
      if (A[i][j] >= '0' && A[i][j] <= '9') setdp(0, i, j, i, j);
  vector<int> st;
  G.push_back(st);
  for (int i1 = 0; i1 < n; i1++)
    for (int j1 = 0; j1 < n; j1++)
      for (int i2 = 0; i2 < n; i2++)
        for (int j2 = 0; j2 < n; j2++)
          for (int nt = 0; nt <= t; nt++)
            dp[i1][j1][i2][j2] |= _dp[nt][i1][j1][i2][j2];
  for (int i1 = 0; i1 < n; i1++)
    for (int j1 = 0; j1 < n; j1++)
      if (A[i1][j1] > '0' && A[i1][j1] <= '9') {
        int k = G.size();
        vector<int> g;
        G.push_back(g);
        E[k] = A[i1][j1] - '0';
        for (int i2 = 0; i2 < n; i2++)
          for (int j2 = 0; j2 < n; j2++)
            if (B[i2][j2] > '0' && B[i2][j2] <= '9')
              if (dp[i2][j2][i1][j1]) {
                int _k;
                if (pN[i2][j2] == 0) {
                  vector<int> _g;
                  _k = G.size();
                  G.push_back(_g);
                  pN[i2][j2] = _k;
                } else {
                  _k = pN[i2][j2];
                }
                G[k].push_back(_k);
                G[_k].push_back(k);
                C[k][_k] = 10000;
                C[_k][k] = 0;
              }
      }
  for (int i2 = 0; i2 < n; i2++)
    for (int j2 = 0; j2 < n; j2++)
      if (B[i2][j2] > '0' && B[i2][j2] <= '9' && pN[i2][j2] > 0) {
        int _k;
        _k = pN[i2][j2];
        G[_k].push_back(0);
        C[_k][0] = B[i2][j2] - '0';
        C[0][_k] = 0;
      }
  while (1) {
    bool ff = true;
    for (int i = 1; i < G.size(); i++)
      while (E[i] > 0) {
        bool f = true;
        int minH = 10000;
        for (int _j = 0; _j < G[i].size(); _j++) {
          int j = G[i][_j];
          if (C[i][j] - F[i][j]) minH = min(minH, H[j]);
          if (C[i][j] - F[i][j] > 0 && H[i] == H[j] + 1) {
            int d = min(C[i][j] - F[i][j], E[i]);
            F[i][j] += d;
            F[j][i] -= d;
            E[i] -= d;
            E[j] += d;
            f = false;
            ff = false;
            if (E[i] == 0) goto next;
          }
        }
        if (H[i] != minH + 1 && minH != 10000)
          f = false, ff = false, H[i] = minH + 1;
        if (f)
        next:
          break;
      }
    if (ff) break;
  }
exit:
  cout << E[0];
  return (0);
}
