#include <bits/stdc++.h>
#pragma comment(linker, "/stack:200000000")
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
using namespace std;
template <class T>
void show(const vector<T> &a) {
  for (T x : a) cout << x << " ";
  cout << '\n';
}
const long long N = 3e5 + 50, oo = 1e18 + 100, mod = 1e9 + 9;
const long double eps = 1e-9, PI = 2 * acos(0.0);
vector<long long> vertices[N];
vector<long long> visit(N, 0);
long long n, m, k;
long long cnt = 0;
char cap[15][15];
char lab[15][15];
bool vis[15][15];
long long d[15][15];
long long bad[15][15];
vector<long long> x = {1, -1, 0, 0};
vector<long long> y = {0, 0, 1, -1};
void bfs(long long a, long long b) {
  for (long long i = 1; i <= n; i++) {
    for (long long j = 1; j <= n; j++) {
      vis[i][j] = false;
      d[i][j] = oo;
    }
  }
  vis[a][b] = true;
  d[a][b] = 0;
  queue<pair<long long, long long> > q;
  q.push({a, b});
  while (!q.empty()) {
    pair<long long, long long> tmp = q.front();
    q.pop();
    long long i = tmp.first;
    long long j = tmp.second;
    for (long long z = 0; z < 4; z++) {
      long long nx = x[z] + i;
      long long ny = y[z] + j;
      if (nx && nx <= n && ny && ny <= n && !vis[nx][ny] &&
          lab[nx][ny] >= '0' && lab[nx][ny] <= '9' &&
          bad[nx][ny] >= d[i][j] + 1) {
        vis[nx][ny] = true;
        if (bad[nx][ny] > d[i][j] + 1) q.push({nx, ny});
        d[nx][ny] = d[i][j] + 1;
      }
    }
  }
}
vector<long long> mt(N, -1);
bool kuhn(long long u) {
  if (visit[u] != cnt) {
    visit[u] = cnt;
    for (auto v : vertices[u]) {
      if (mt[v] == -1 || kuhn(mt[v])) {
        mt[v] = u;
        return true;
      }
    }
  }
  return false;
}
signed main() {
  ios::sync_with_stdio(0);
  cout.tie(0);
  cin.tie(0);
  cin >> n >> k;
  pair<long long, long long> st;
  for (long long i = 1; i <= n; i++) {
    for (long long j = 1; j <= n; j++) {
      cin >> lab[i][j];
      if (lab[i][j] == 'Z') st = {i, j};
    }
  }
  vector<pair<long long, long long> > vcap;
  for (long long i = 1; i <= n; i++) {
    for (long long j = 1; j <= n; j++) {
      cin >> cap[i][j];
      if (cap[i][j] >= '1' && cap[i][j] <= '9') {
        vcap.push_back({i, j});
      }
    }
  }
  for (long long i = 1; i <= n; i++) {
    for (long long j = 1; j <= n; j++) {
      bad[i][j] = oo;
    }
  }
  bfs(st.first, st.second);
  for (long long i = 1; i <= n; i++) {
    for (long long j = 1; j <= n; j++) {
      bad[i][j] = d[i][j];
    }
  }
  for (long long i = 1; i <= n; i++) {
    for (long long j = 1; j <= n; j++) {
      if (lab[i][j] >= '1' && lab[i][j] <= '9') {
        bfs(i, j);
        for (auto to : vcap) {
          long long a = to.first;
          long long b = to.second;
          if (d[a][b] <= k) {
            for (long long z = 0; z < lab[i][j] - '0'; z++) {
              for (long long p = 0; p < cap[a][b] - '0'; p++) {
                vertices[10 * (n * i + j) + z].push_back(10 * (n * a + b) + p);
              }
            }
          }
        }
      }
    }
  }
  long long ans = 0;
  cnt = 0;
  for (long long i = 1; i <= n; i++) {
    for (long long j = 1; j <= n; j++) {
      if (lab[i][j] >= '1' && lab[i][j] <= '9') {
        for (long long z = 0; z < lab[i][j] - '0'; z++) {
          cnt++;
          if (kuhn(10 * (n * i + j) + z)) {
            ans++;
          }
        }
      }
    }
  }
  cout << ans;
}
