#include <bits/stdc++.h>
using namespace std;
void bad(string mes = "Impossible") {
  cout << mes;
  exit(0);
}
template <typename... T>
void shit(T&... x) {}
template <typename... T>
void dec(T&... x) {
  shit(--x...);
}
template <typename... T>
void inc(T&... x) {
  shit(++x...);
}
template <typename T>
string bin(T x, int st = 2) {
  string ans = "";
  while (x > 0) {
    ans += char('0' + x % st);
    x /= st;
  }
  reverse(ans.begin(), ans.end());
  return ans.empty() ? "0" : ans;
}
template <typename T>
T input() {
  T ans = 0, m = 1;
  char c = ' ';
  while (!((c >= '0' && c <= '9') || c == '-')) c = getchar();
  if (c == '-') m = -1, c = getchar();
  while (c >= '0' && c <= '9') {
    ans = ans * 10 + (c - '0'), c = getchar();
  }
  return ans * m;
}
template <typename T>
void read(T& a) {
  a = input<T>();
}
template <typename T>
void read(T& a, T& b) {
  read(a), read(b);
}
template <typename T>
void read(T& a, T& b, T& c) {
  read(a, b), read(c);
}
template <typename T>
void read(T& a, T& b, T& c, T& d) {
  read(a, b), read(c, d);
}
const int inf = 1e9;
const double eps = 1e-9;
const int maxn = 1e6 + 227 + 1, base = 1e9 + 7;
const int sigm = 26;
const long long llinf = 1e18 + 1;
template <typename T>
T binpow(T n, T second) {
  if (second <= 0) return 1LL;
  if (second % 2 == 0) {
    T b = binpow(n, second / 2);
    return (1LL * b * b) % base;
  } else {
    return (1LL * binpow(n, second - 1) * n) % base;
  }
}
int inpt[55][55];
int good[55][55];
bool have4(int x, int y) {
  return good[x + 1][y] == 4 || good[x - 1][y] == 4 || good[x][y + 1] == 4 ||
         good[x][y - 1] == 4;
}
int main() {
  int n;
  read(n);
  pair<int, int> left4, right4;
  left4 = right4 = make_pair(-1, -1);
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++) {
      char c = '\n';
      while (c == '\n') c = getchar();
      inpt[i][j] = c - '0';
      if (inpt[i][j] == 4) {
        if (left4 == make_pair(-1, -1)) left4 = make_pair(i, j);
        right4 = make_pair(i, j);
      }
    }
  if (left4 == make_pair(-1, -1)) bad("No");
  for (int i = left4.first; i <= right4.first; i++)
    for (int j = left4.second; j <= right4.second; j++) good[i][j] = 4;
  good[left4.first - 1][left4.second - 1] = 1;
  good[left4.first - 1][right4.second + 1] = 1;
  good[right4.first + 1][left4.second - 1] = 1;
  good[right4.first + 1][right4.second + 1] = 1;
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++) {
      if (good[i][j] == 0 && have4(i, j)) good[i][j] = 2;
    }
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++) {
      if (good[i][j] != inpt[i][j]) bad("No");
    }
  bad("Yes");
  return 0;
}
