#include <bits/stdc++.h>
#pragma GCC optimize("Ofast,unroll-loops,no-stack-protector")
using namespace std;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
const int N = 10 + 5, inf = 1e9 + 5;
int n, boom;
char sci[N][N], cap[N][N];
int id[N][N];
pair<int, int> reactor;
int dr[] = {-1, 0, 1, 0};
int dc[] = {0, 1, 0, -1};
bool valid(int r, int c) {
  return 1 <= r && r <= n && 1 <= c && c <= n && sci[r][c] != 'Y';
}
int vis[N][N];
int distTox[N][N], dist[N][N], timer = 0;
void reactorSim(pair<int, int> second) {
  ++timer;
  queue<pair<int, int> > q;
  q.push(second);
  while (!q.empty()) {
    auto [r, c] = q.front();
    q.pop();
    vis[r][c] = timer;
    if (distTox[r][c] == inf) distTox[r][c] = 0;
    for (auto i = (0) - ((0) > (4)); i != 4 - ((0) > (4));
         i += 1 - 2 * ((0) > (4))) {
      int nr = r + dr[i];
      int nc = c + dc[i];
      if (valid(nr, nc) && vis[nr][nc] != timer) {
        q.emplace(nr, nc);
        distTox[nr][nc] = distTox[r][c] + 1;
      }
    }
  }
}
bool reach(pair<int, int> second, pair<int, int> e) {
  ;
  ++timer;
  memset(dist, 0, sizeof dist);
  queue<pair<int, int> > q;
  q.push(second);
  while (!q.empty()) {
    auto [r, c] = q.front();
    q.pop();
    vis[r][c] = timer;
    ;
    ;
    if (dist[r][c] <= distTox[r][c] && pair<int, int>(r, c) == e &&
        dist[r][c] <= boom)
      return true;
    if (dist[r][c] >= distTox[r][c]) continue;
    for (auto i = (0) - ((0) > (4)); i != 4 - ((0) > (4));
         i += 1 - 2 * ((0) > (4))) {
      int nr = r + dr[i];
      int nc = c + dc[i];
      if (valid(nr, nc) && vis[nr][nc] != timer) {
        q.emplace(nr, nc);
        dist[nr][nc] = dist[r][c] + 1;
      }
    }
  }
  return false;
}
template <class F>
struct Dinic {
  static constexpr F eps = (F)1e-9;
  struct Edge {
    int v, inv;
    F cap, flow;
    Edge(int v, F cap, int inv) : v(v), cap(cap), flow(0), inv(inv) {}
  };
  int second, t, n, m = 0;
  vector<vector<Edge> > g;
  vector<int> dist, ptr;
  Dinic(int n, int ss = -1, int tt = -1)
      : n(n), g(n + 5), dist(n + 5), ptr(n + 5) {
    second = ss == -1 ? n + 1 : ss;
    t = tt == -1 ? n + 2 : tt;
  }
  void add(int u, int v, F cap) {
    g[u].push_back(Edge(v, cap, int(g[v].size())));
    g[v].push_back(Edge(u, 0, int(g[u].size()) - 1));
    m += 2;
  }
  bool bfs() {
    fill(begin(dist), end(dist), -1);
    queue<int> qu({second});
    dist[second] = 0;
    while (int(qu.size())) {
      int u = qu.front();
      qu.pop();
      for (Edge &e : g[u])
        if (e.cap - e.flow > eps)
          if (dist[e.v] == -1) {
            dist[e.v] = dist[u] + 1;
            qu.push(e.v);
          }
    }
    return dist[t] != -1;
  }
  F dfs(int u, F flow = numeric_limits<F>::max()) {
    if (flow <= eps || u == t) return max<F>(0, flow);
    for (int &i = ptr[u]; i < int(g[u].size()); i++) {
      Edge &e = g[u][i];
      if (e.cap - e.flow > eps && dist[u] + 1 == dist[e.v]) {
        F nflow = dfs(e.v, min<F>(flow, e.cap - e.flow));
        if (nflow > eps) {
          e.flow += nflow;
          g[e.v][e.inv].flow -= nflow;
          return nflow;
        }
      }
    }
    return 0;
  }
  F maxFlow() {
    F flow = 0;
    while (bfs()) {
      fill(begin(ptr), end(ptr), 0);
      while (F nflow = dfs(second)) flow += nflow;
    }
    return flow;
  }
};
int main() {
  cin.tie(0)->sync_with_stdio(0), cout.tie(0);
  while (cin >> n >> boom) {
    int cnt = 0;
    for (auto r = (1) - ((1) > (n + 1)); r != n + 1 - ((1) > (n + 1));
         r += 1 - 2 * ((1) > (n + 1)))
      for (auto c = (1) - ((1) > (n + 1)); c != n + 1 - ((1) > (n + 1));
           c += 1 - 2 * ((1) > (n + 1))) {
        id[r][c] = ++cnt;
        cin >> sci[r][c];
        if (sci[r][c] == 'Z') reactor = {r, c};
      }
    for (auto r = (1) - ((1) > (n + 1)); r != n + 1 - ((1) > (n + 1));
         r += 1 - 2 * ((1) > (n + 1)))
      for (auto c = (1) - ((1) > (n + 1)); c != n + 1 - ((1) > (n + 1));
           c += 1 - 2 * ((1) > (n + 1))) {
        cin >> cap[r][c];
        distTox[r][c] = inf;
      }
    Dinic<int> g(n * n * 2);
    reactorSim(reactor);
    for (auto r = (1) - ((1) > (n + 1)); r != n + 1 - ((1) > (n + 1));
         r += 1 - 2 * ((1) > (n + 1)))
      for (auto c = (1) - ((1) > (n + 1)); c != n + 1 - ((1) > (n + 1));
           c += 1 - 2 * ((1) > (n + 1)))
        for (auto rr = (1) - ((1) > (n + 1)); rr != n + 1 - ((1) > (n + 1));
             rr += 1 - 2 * ((1) > (n + 1)))
          for (auto cc = (1) - ((1) > (n + 1)); cc != n + 1 - ((1) > (n + 1));
               cc += 1 - 2 * ((1) > (n + 1))) {
            if ('1' > sci[r][c] || sci[r][c] > '9') continue;
            if ('1' > cap[rr][cc] || cap[rr][cc] > '9') continue;
            if (reach({r, c}, {rr, cc}))
              g.add(id[r][c], n * n + id[rr][cc], inf);
          }
    for (auto r = (1) - ((1) > (n + 1)); r != n + 1 - ((1) > (n + 1));
         r += 1 - 2 * ((1) > (n + 1)))
      for (auto c = (1) - ((1) > (n + 1)); c != n + 1 - ((1) > (n + 1));
           c += 1 - 2 * ((1) > (n + 1))) {
        if (isdigit(sci[r][c])) g.add(g.second, id[r][c], sci[r][c] - '0');
        if (isdigit(cap[r][c])) g.add(n * n + id[r][c], g.t, cap[r][c] - '0');
      }
    int saved = g.maxFlow();
    cout << saved << '\n';
  }
  return 0;
}
