#include <bits/stdc++.h>
using namespace std;
int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0};
vector<string> start, End;
vector<vector<int> > dead, dist, graph, Rgraph, people, lab;
int n, T, V, s, t;
const int inf = 100000;
vector<int> parent;
bool BFS() {
  bool visited[V];
  for (int i = 0; i < V; ++i) visited[i] = 0;
  queue<int> q;
  q.push(s);
  visited[s] = true;
  parent[s] = -1;
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    for (int v = 0; v < V; v++) {
      if (visited[v] == false && Rgraph[u][v] > 0) {
        q.push(v);
        parent[v] = u;
        visited[v] = true;
      }
    }
  }
  return (visited[t] == true);
}
int fordFulkerson() {
  int u, v;
  parent.assign(V, -1);
  int max_flow = 0;
  while (BFS()) {
    int path_flow = INT_MAX;
    for (v = t; v != s; v = parent[v]) {
      u = parent[v];
      path_flow = min(path_flow, Rgraph[u][v]);
    }
    for (v = t; v != s; v = parent[v]) {
      u = parent[v];
      Rgraph[u][v] -= path_flow;
      Rgraph[v][u] += path_flow;
    }
    max_flow += path_flow;
  }
  return max_flow;
}
void bfs(int r, int c) {
  queue<pair<int, int> > q;
  q.push(pair<int, int>(r, c));
  dead[r][c] = 0;
  while (!q.empty()) {
    pair<int, int> x = q.front();
    q.pop();
    int a = x.first;
    int b = x.second;
    for (int i = 0; i < 4; ++i) {
      int c = a + dx[i];
      int d = b + dy[i];
      if (c >= 0 && d >= 0 && c < n && d < n) {
        if (start[c][d] != 'Z' && start[c][d] != 'Y' && dead[c][d] == inf) {
          dead[c][d] = dead[a][b] + 1;
          q.push(pair<int, int>(c, d));
        }
      }
    }
  }
}
void bfs2(int r, int p) {
  int y, yy;
  dist[r][p] = 0;
  if (End[r][p] >= '1' && End[r][p] <= '9') {
    graph[people[r][p]][lab[r][p]] = inf;
    Rgraph[people[r][p]][lab[r][p]] = inf;
  }
  queue<pair<int, int> > q;
  q.push(pair<int, int>(r, p));
  while (!q.empty()) {
    pair<int, int> x = q.front();
    q.pop();
    int a = x.first;
    int b = x.second;
    for (int i = 0; i < 4; ++i) {
      int c = a + dx[i];
      int d = b + dy[i];
      if (c >= 0 && d >= 0 && c < n && d < n) {
        if (dist[c][d] == inf && start[c][d] != 'Y' && start[c][d] != 'Z') {
          dist[c][d] = dist[a][b] + 1;
          if (dist[c][d] <= T && dist[c][d] <= dead[c][d]) {
            if (dist[c][d] < dead[c][d]) q.push(pair<int, int>(c, d));
            if (dist[c][d] <= dead[c][d] && End[c][d] >= '1' &&
                End[c][d] <= '9') {
              graph[people[r][p]][lab[c][d]] = inf;
              Rgraph[people[r][p]][lab[c][d]] = inf;
            }
          }
        }
      }
    }
  }
}
int main() {
  int i, j, k, l;
  scanf("%d %d", &n, &T);
  dead.assign(n, vector<int>(n, inf));
  string ch;
  for (i = 0; i < n; ++i) {
    cin >> ch;
    start.push_back(ch);
  }
  for (i = 0; i < n; ++i) {
    cin >> ch;
    End.push_back(ch);
  }
  people.assign(n, vector<int>(n, -1));
  lab.assign(n, vector<int>(n, -1));
  int cnt = 1;
  for (i = 0; i < n; ++i) {
    for (j = 0; j < n; ++j) {
      if (start[i][j] >= '1' && start[i][j] <= '9') {
        people[i][j] = cnt;
        cnt++;
      }
    }
  }
  for (i = 0; i < n; ++i) {
    for (j = 0; j < n; ++j) {
      if (End[i][j] >= '1' && End[i][j] <= '9') {
        lab[i][j] = cnt;
        ++cnt;
      }
    }
  }
  V = cnt + 1;
  s = 0;
  t = V - 1;
  graph.assign(V, vector<int>(V, 0));
  Rgraph.assign(V, vector<int>(V, 0));
  for (i = 0; i < n; ++i) {
    for (j = 0; j < n; ++j) {
      if (start[i][j] >= '1' && start[i][j] <= '9') {
        graph[s][people[i][j]] = start[i][j] - '0';
        Rgraph[s][people[i][j]] = start[i][j] - '0';
      }
      if (End[i][j] >= '1' && End[i][j] <= '9') {
        graph[lab[i][j]][t] = End[i][j] - '0';
        Rgraph[lab[i][j]][t] = End[i][j] - '0';
      }
    }
  }
  for (i = 0; i < n; ++i) {
    for (j = 0; j < n; ++j) {
      if (start[i][j] == 'Z') {
        bfs(i, j);
        goto done;
      }
    }
  }
done : {};
  for (i = 0; i < n; ++i) {
    for (j = 0; j < n; ++j) {
      if (start[i][j] >= '1' && start[i][j] <= '9') {
        dist.assign(n, vector<int>(n, inf));
        bfs2(i, j);
      }
    }
  }
  cout << fordFulkerson();
}
