#include <bits/stdc++.h>
using namespace std;
const int INF = 1 << 29;
const int MAXN = 500;
struct edge {
  int a, b, cap, flow;
};
bool m[11][11];
vector<int> g[MAXN];
vector<edge> e;
int d[MAXN], ptr[MAXN], n, xb, yb, t, temp[11][11], kaps[11][11];
int way(int x1, int Y1, int x2, int y2) {
  queue<pair<int, pair<int, int> > > l;
  l.push(make_pair(0, make_pair(x1, Y1)));
  int h[11][11];
  for (int p = 0; p < n; p++)
    for (int b = 0; b < n; b++) h[p][b] = INF;
  while (!l.empty()) {
    int v = l.front().first, x = l.front().second.first,
        y = l.front().second.second;
    l.pop();
    h[x][y] = v;
    if (x > 0 && m[x - 1][y] && h[x - 1][y] > h[x][y] + 1 &&
        (x - 1 == x2 && y == y2 && temp[x - 1][y] >= h[x][y] + 1 ||
         !(x - 1 == x2 && y == y2) && temp[x - 1][y] > h[x][y] + 1))
      l.push(make_pair(v + 1, make_pair(x - 1, y)));
    if (y > 0 && m[x][y - 1] && h[x][y - 1] > h[x][y] + 1 &&
        (x == x2 && y - 1 == y2 && temp[x][y - 1] >= h[x][y] + 1 ||
         !(x == x2 && y - 1 == y2) && temp[x][y - 1] > h[x][y] + 1))
      l.push(make_pair(v + 1, make_pair(x, y - 1)));
    if (x < n - 1 && m[x + 1][y] && h[x + 1][y] > h[x][y] + 1 &&
        (x + 1 == x2 && y == y2 && temp[x + 1][y] >= h[x][y] + 1 ||
         !(x + 1 == x2 && y == y2) && temp[x + 1][y] > h[x][y] + 1))
      l.push(make_pair(v + 1, make_pair(x + 1, y)));
    if (y < n - 1 && m[x][y + 1] && h[x][y + 1] > h[x][y] + 1 &&
        (x == x2 && y + 1 == y2 && temp[x][y + 1] >= h[x][y] + 1 ||
         !(x == x2 && y + 1 == y2) && temp[x][y + 1] > h[x][y] + 1))
      l.push(make_pair(v + 1, make_pair(x, y + 1)));
  }
  return h[x2][y2];
}
void add_edge(int a, int b, int cap) {
  edge e1 = {a, b, cap, 0};
  edge e2 = {b, a, 0, 0};
  g[a].push_back((int)e.size());
  e.push_back(e1);
  g[b].push_back((int)e.size());
  e.push_back(e2);
}
bool bfs() {
  queue<int> q;
  q.push(0);
  memset(d, -1, (n * n * 2 + 2) * sizeof d[0]);
  d[0] = 0;
  while (!q.empty() && d[n * n * 2 + 1] == -1) {
    int v = q.front();
    q.pop();
    for (size_t j = 0; j < g[v].size(); j++) {
      int id = g[v][j], to = e[id].b;
      if (d[to] == -1 && e[id].flow < e[id].cap) {
        q.push(to);
        d[to] = d[v] + 1;
      }
    }
  }
  return d[n * n * 2 + 1] != -1;
}
int dfs(int v, int flow) {
  if (!flow) return 0;
  if (v == n * n * 2 + 1) return flow;
  for (; ptr[v] < (int)g[v].size(); ptr[v]++) {
    int id = g[v][ptr[v]], to = e[id].b;
    if (d[to] != d[v] + 1) continue;
    int pushed = dfs(to, min(flow, e[id].cap - e[id].flow));
    if (pushed) {
      e[id].flow += pushed;
      e[id ^ 1].flow -= pushed;
      return pushed;
    }
  }
  return 0;
}
int max_flow() {
  int flow = 0;
  for (;;) {
    if (!bfs()) break;
    memset(ptr, 0, (n * n * 2 + 2) * sizeof ptr[0]);
    while (int pushed = dfs(0, INF)) flow += pushed;
  }
  return flow;
}
int main() {
  cin >> n >> t;
  queue<pair<int, pair<int, int> > > l;
  char x;
  int k = 1;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      cin >> x;
      temp[i][j] = t;
      if (x == 'Z') {
        xb = i;
        yb = j;
        m[i][j] = false;
      } else if (x == 'Y')
        m[i][j] = false;
      else
        m[i][j] = true;
      add_edge(0, k++, x == 'Z' || x == 'Y' ? 0 : x - 48);
    }
  }
  k = n * n + 1;
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++) {
      cin >> x;
      if (x >= '0' && x <= '9') kaps[i][j] = x - 48;
      add_edge(k++, n * n * 2 + 1, x == 'Z' || x == 'Y' ? 0 : x - 48);
    }
  l.push(make_pair(0, make_pair(xb, yb)));
  while (!l.empty()) {
    int v = l.front().first, x = l.front().second.first,
        y = l.front().second.second;
    l.pop();
    temp[x][y] = v;
    if (x > 0 && v + 1 < temp[x - 1][y] && m[x - 1][y])
      l.push(make_pair(v + 1, make_pair(x - 1, y)));
    if (y > 0 && v + 1 < temp[x][y - 1] && m[x][y - 1])
      l.push(make_pair(v + 1, make_pair(x, y - 1)));
    if (x < n - 1 && v + 1 < temp[x + 1][y] && m[x + 1][y])
      l.push(make_pair(v + 1, make_pair(x + 1, y)));
    if (y < n - 1 && v + 1 < temp[x][y + 1] && m[x][y + 1])
      l.push(make_pair(v + 1, make_pair(x, y + 1)));
  }
  k = 0;
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++) {
      int k1 = n * n;
      k++;
      for (int z = 0; z < n; z++)
        for (int w = 0; w < n; w++) {
          k1++;
          if (m[i][j] && m[z][w] && way(i, j, z, w) <= t) add_edge(k, k1, INF);
        }
    }
  cout << max_flow();
  return 0;
}
