#include <bits/stdc++.h>
using namespace std;
const int MAXN = 20 + 5;
const double EPS = 1e-9;
const long long INF = 1000000000 + 5;
const int MAXN2 = 1e3 + 5;
char s[MAXN][MAXN];
char s2[MAXN][MAXN];
int dp[MAXN][MAXN][MAXN][MAXN];
int dp2[MAXN][MAXN];
bool visited[MAXN][MAXN];
int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0};
int n, t;
int px = 0, py = 0;
vector<int> g[MAXN2], gw[MAXN2];
void dfs(int x2, int y2) {
  queue<int> qx, qy;
  qx.push(x2);
  qy.push(y2);
  dp2[x2][y2] = 0;
  while (!qx.empty()) {
    int x = qx.front();
    qx.pop();
    int y = qy.front();
    qy.pop();
    for (int i = 0; i < 4; i++) {
      int xn = x + dx[i];
      int yn = y + dy[i];
      if (xn >= 0 && xn < n && yn >= 0 && yn < n && s[xn][yn] != 'Y' &&
          s[xn][yn] != 'Z' && dp2[xn][yn] == INF) {
        dp2[xn][yn] = min(dp2[xn][yn], dp2[x][y] + 1);
        qx.push(xn);
        qy.push(yn);
      }
    }
  }
}
void dfs2(int x2, int y2) {
  queue<int> qx, qy;
  qx.push(x2);
  qy.push(y2);
  visited[x2][y2] = true;
  while (!qx.empty()) {
    int x = qx.front();
    qx.pop();
    int y = qy.front();
    qy.pop();
    for (int i = 0; i < 4; i++) {
      int xn = x + dx[i];
      int yn = y + dy[i];
      if (xn >= 0 && xn < n && yn >= 0 && yn < n && s[xn][yn] != 'Y' &&
          s[xn][yn] != 'Z' && !visited[xn][yn]) {
        int d = dp[px][py][x][y];
        dp[px][py][xn][yn] = d + 1;
        visited[xn][yn] = true;
        if (d + 1 < dp2[xn][yn]) {
          qx.push(xn);
          qy.push(yn);
        }
      }
    }
  }
}
int p[MAXN2], d[MAXN2];
int f[MAXN2][MAXN2];
bool used[MAXN2];
int main() {
  char tmp;
  scanf("%d%d", &n, &t);
  for (int i = 0; i < n; i++) {
    scanf("%1c", &tmp);
    scanf("%s", &s[i]);
  }
  scanf("%1c", &tmp);
  for (int i = 0; i < n; i++) {
    scanf("%1c", &tmp);
    scanf("%s", &s2[i]);
  }
  int xs = 0, ys = 0;
  int cnt1 = 0, cnt2 = 0;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      dp2[i][j] = INF;
      if (s[i][j] >= '1' && s[i][j] <= '9') cnt1++;
      if (s2[i][j] >= '1' && s2[i][j] <= '9') cnt2++;
      if (s[i][j] == 'Z') {
        xs = i;
        ys = j;
      }
    }
  }
  dfs(xs, ys);
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      if (s[i][j] >= '0' && s[i][j] <= '9') {
        for (int ii = 0; ii < n; ii++)
          for (int jj = 0; jj < n; jj++) {
            dp[i][j][ii][jj] = INF;
            visited[ii][jj] = false;
          }
        px = i;
        py = j;
        dp[i][j][i][j] = 0;
        dfs2(i, j);
        int gh = 0;
      }
    }
  }
  int n2 = cnt1 + cnt2;
  int v1 = -1, v2 = cnt1 - 1;
  int sr = n2 + 1, sk = sr + 1;
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      if (s[i][j] >= '1' && s[i][j] <= '9') {
        v1++;
        v2 = cnt1 - 1;
        int c1 = s[i][j] - '0';
        g[sr].push_back(v1);
        gw[sr].push_back(c1);
        g[v1].push_back(sr);
        gw[v1].push_back(0);
        for (int i2 = 0; i2 < n; i2++) {
          for (int j2 = 0; j2 < n; j2++) {
            if (s2[i2][j2] >= '1' && s2[i2][j2] <= '9') {
              v2++;
              int c2 = s2[i2][j2] - '0';
              if (dp[i][j][i2][j2] <= dp2[i2][j2] && dp[i][j][i2][j2] <= t) {
                g[v1].push_back(v2);
                gw[v1].push_back(INF);
                g[v2].push_back(v1);
                gw[v2].push_back(0);
              }
            }
          }
        }
      }
    }
  }
  v2 = cnt1 - 1;
  for (int i2 = 0; i2 < n; i2++) {
    for (int j2 = 0; j2 < n; j2++) {
      if (s2[i2][j2] >= '1' && s2[i2][j2] <= '9') {
        v2++;
        int c2 = s2[i2][j2] - '0';
        g[v2].push_back(sk);
        gw[v2].push_back(c2);
        g[sk].push_back(v2);
        gw[sk].push_back(0);
      }
    }
  }
  int sz2, v, to, cn;
  n2 += 3;
  p[sr] = -1;
  for (;;) {
    for (int i = 0; i < n2; i++) {
      d[i] = -1;
      used[i] = false;
    }
    queue<int> q;
    q.push(sr);
    d[sr] = INF;
    used[sr] = true;
    while (!q.empty()) {
      v = q.front();
      q.pop();
      sz2 = g[v].size();
      for (int i = 0; i < sz2; i++) {
        to = g[v][i];
        cn = gw[v][i];
        if (!used[to] && cn - f[v][to] > 0) {
          d[to] = min(d[v], cn - f[v][to]);
          p[to] = v;
          used[to] = true;
          q.push(to);
        }
      }
    }
    if (!used[sk]) break;
    v = sk;
    int ds = d[sk];
    while (p[v] != -1) {
      to = p[v];
      f[to][v] += ds;
      f[v][to] -= ds;
      v = to;
    }
  }
  int ans = 0;
  sz2 = g[sr].size();
  for (int i = 0; i < sz2; i++) {
    to = g[sr][i];
    ans += f[sr][to];
  }
  printf("%d", ans);
  return 0;
}
