#include <bits/stdc++.h>
using namespace std;
long long int modulo = 1e9 + 7;
int n, m, k;
int v[12][12];
int acumle[12][12];
int acumri[12][12];
vector<int> opciones[1 << 10];
long long int calcula() {
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      acumle[i][j] = acumle[i - 1][j] | acumle[i][j - 1];
      if (acumle[i][j] & v[i][j]) return 0;
      acumle[i][j] |= v[i][j];
    }
  }
  for (int i = n; i >= 1; i--) {
    for (int j = m; j >= 1; j--) {
      acumri[i][j] = acumri[i + 1][j] | acumri[i][j + 1];
      if (acumri[i][j] & v[i][j]) return 0;
      acumri[i][j] |= v[i][j];
    }
  }
  int numopciones = k + 1;
  int iopciones, jopciones;
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      if (v[i][j] == 0 and
          int(opciones[acumle[i][j] | acumri[i][j]].size()) < numopciones) {
        numopciones = int(opciones[acumle[i][j] | acumri[i][j]].size());
        iopciones = i;
        jopciones = j;
      }
    }
  }
  if (numopciones == k + 1) return 1;
  int opcion = (((1 << k) - 1) ^ acumri[1][1]) | acumle[iopciones][jopciones] |
               acumri[iopciones][jopciones];
  long long int sol = 0;
  {
    vector<int> &op = opciones[acumri[1][1]];
    if (int(op.size())) {
      int b = op[0];
      v[iopciones][jopciones] = 1 << b;
      sol = (int(op.size()) * calcula()) % modulo;
      v[iopciones][jopciones] = 0;
    }
  }
  vector<int> &op = opciones[opcion];
  for (int d = 0; d < int(op.size()); d++) {
    v[iopciones][jopciones] = 1 << op[d];
    sol = (sol + calcula()) % modulo;
  }
  v[iopciones][jopciones] = 0;
  return sol;
}
int main() {
  cin >> n >> m >> k;
  if (n + m - 1 > 10) {
    cout << 0 << endl;
    exit(0);
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= m; j++) {
      int x;
      cin >> x;
      if (x) v[i][j] = 1 << (x - 1);
    }
  }
  for (int c = 0; c < 1 << k; c++)
    for (int b = 0; b < k; b++)
      if ((c & (1 << b)) == 0) opciones[c].push_back(b);
  cout << calcula() << endl;
}
