#include <bits/stdc++.h>
using namespace std;
const int N = 10 + 2;
const int MX = 900 + 7;
int x, y, n, T;
string s[N], t[N];
int dr[] = {1, -1, 0, 0};
int dc[] = {0, 0, 1, -1};
int dis[N][N], d[N][N];
pair<int, int> q[N * N];
int mat[MX][2];
bool mark[MX];
vector<int> adj[MX];
bool valid(int r, int c) {
  return r >= 0 && c >= 0 && r < n && c < n && s[r][c] >= '0' && s[r][c] <= '9';
}
void bfs(int sr, int sc) {
  memset(dis, 63, sizeof dis);
  dis[sr][sc] = 0;
  int h = 0, t = 0;
  q[t++] = {sr, sc};
  while (h < t) {
    int r = q[h].first;
    int c = q[h].second;
    h++;
    for (int i = 0; i < 4; i++) {
      int R = r + dr[i];
      int C = c + dc[i];
      if (valid(R, C) && dis[R][C] > dis[r][c] + 1) {
        dis[R][C] = dis[r][c] + 1;
        q[t++] = {R, C};
      }
    }
  }
}
bool dfs(int v) {
  if (mark[v]) return false;
  mark[v] = true;
  for (auto u : adj[v])
    if (mat[u][1] == -1 || dfs(mat[u][1])) {
      mat[u][1] = v;
      mat[v][0] = u;
      return true;
    }
  return false;
}
int main() {
  ios::sync_with_stdio(false);
  cin >> n >> T;
  for (int i = 0; i < n; i++) cin >> s[i];
  for (int i = 0; i < n; i++) cin >> t[i];
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++)
      if (s[i][j] == 'Z') {
        bfs(i, j);
        memcpy(d, dis, sizeof dis);
      }
  int cnt = 0;
  int c = 0;
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++)
      if ('0' < s[i][j] && s[i][j] <= '9') {
        bfs(i, j);
        c = 0;
        for (int x = 0; x < n; x++)
          for (int y = 0; y < n; y++)
            if ('0' < t[x][y] && t[x][y] <= '9') {
              bool flag = dis[x][y] == 0;
              for (int f = 0; f < 4; f++) {
                int X = x + dr[f];
                int Y = y + dc[f];
                if (valid(X, Y) && dis[X][Y] < d[X][Y]) flag = true;
              }
              if (dis[x][y] <= T && flag && dis[x][y] <= d[x][y])
                for (int k = 0; k < s[i][j] - '0'; k++)
                  for (int l = 0; l < t[x][y] - '0'; l++)
                    adj[cnt + k].push_back(c + l);
              c += t[x][y] - '0';
            }
        cnt += s[i][j] - '0';
      }
  memset(mat, -1, sizeof mat);
  int ans = 0;
  bool found = true;
  while (found) {
    found = false;
    memset(mark, 0, sizeof mark);
    for (int i = 0; i < cnt; i++)
      if (mat[i][0] == -1 && dfs(i)) ans++, found = true;
  }
  cout << ans << "\n";
  return 0;
}
