#include <bits/stdc++.h>
using namespace std;
mt19937 rnd(chrono::high_resolution_clock::now().time_since_epoch().count());
const long long inf = 1e17 + 7;
const long long max_n = 1001;
long long xdir[]{0, 0, -1, 1}, ydir[]{-1, 1, 0, 0};
vector<long long> gr[max_n];
bool used[max_n];
long long pa[max_n];
bool check(long long x, long long y, vector<string>& second) {
  return x >= 0 && y >= 0 && x < second.size() && y < second.size() &&
         second[x][y] != 'Y' && second[x][y] != 'Z';
}
vector<vector<long long>> bfs(long long st_x, long long st_y,
                              vector<string> second) {
  vector<vector<long long>> res(second.size(),
                                vector<long long>(second.size(), inf));
  res[st_x][st_y] = 0;
  deque<pair<long long, long long>> b;
  b.emplace_back(st_x, st_y);
  while (b.size()) {
    pair<long long, long long> v = b.front();
    b.pop_front();
    for (long long i = 0; i < 4; i++) {
      long long x = v.first + xdir[i];
      long long y = v.second + ydir[i];
      if (!check(x, y, second) || res[x][y] != inf) continue;
      res[x][y] = res[v.first][v.second] + 1;
      b.emplace_back(x, y);
    }
  }
  return res;
}
void scan() {
  long long n, t;
  cin >> n >> t;
  vector<string> s1(n), s2(n);
  for (long long i = 0; i < n; i++) cin >> s1[i];
  for (long long i = 0; i < n; i++) cin >> s2[i];
  long long x_reac, y_reac;
  for (long long i = 0; i < n; i++) {
    for (long long j = 0; j < n; j++) {
      if (s1[i][j] == 'Z') {
        x_reac = i;
        y_reac = j;
      }
    }
  }
  vector<vector<long long>> reac = bfs(x_reac, y_reac, s1);
  for (long long i = 0; i < n; i++) {
    for (long long j = 0; j < n; j++) {
      if (!check(i, j, s1)) continue;
      vector<vector<long long>> a = bfs(i, j, s1);
      for (long long x = 0; x < n; x++) {
        for (long long y = 0; y < n; y++) {
          if (!check(x, y, s1) || a[x][y] > t || a[x][y] > reac[x][y]) continue;
          if (a[x][y] == reac[x][y]) {
            bool good = false;
            for (long long id = 0; id < 4; id++) {
              long long xto = x + xdir[id];
              long long yto = y + ydir[id];
              if (!check(xto, yto, s1) || a[xto][yto] >= reac[xto][yto])
                continue;
              good = true;
            }
            if (!good) continue;
          }
          for (long long num1 = 1; num1 <= s1[i][j] - '0'; num1++) {
            for (long long num2 = 1; num2 <= s2[x][y] - '0'; num2++) {
              gr[10 * (j + i * 10) + num1].emplace_back(10 * (y + 10 * x) +
                                                        num2);
            }
          }
        }
      }
    }
  }
}
bool kuhn(long long v) {
  if (used[v]) return false;
  used[v] = true;
  for (long long to : gr[v]) {
    if (pa[to] == 0 || kuhn(pa[to])) {
      pa[to] = v;
      return true;
    }
  }
  return false;
}
void solve() {
  scan();
  long long n = max_n;
  for (long long i = 0; i < n; i++) {
    kuhn(i);
    for (long long j = 0; j < n; j++) used[j] = false;
  }
  long long res = 0;
  for (long long i = 0; i < n; i++) res += pa[i] != 0;
  cout << res;
}
signed main() {
  cin.tie(0);
  cout.tie(0);
  ios_base::sync_with_stdio(0);
  cout.precision(10);
  solve();
}
