#include <bits/stdc++.h>
using namespace std;
int arr[100][100];
int DP[100][2];
bool zero[100];
int n, m, k;
int ans;
bool same(int i) {
  if (i == 0) {
    return true;
  } else {
    return zero[i] == zero[i - 1];
  }
}
void solve() {
  for (int i = 0; i < n; i++) {
    for (int fst = 0; fst <= 1; fst++) {
      int now = fst;
      int my = 0;
      for (int j = 0; j < m; j++) {
        if (j != 0 && !same(j)) {
          now = 1 - now;
        }
        if (arr[i][j] != now) {
          my++;
        }
      }
      DP[i][fst] = my;
      if (i != 0) {
        DP[i][fst] += min(DP[i - 1][0], DP[i - 1][1]);
      }
    }
  }
  ans = min(ans, DP[n - 1][0]);
  ans = min(ans, DP[n - 1][1]);
}
void brut() {
  for (int mask = 0; mask < (1 << m); mask++) {
    for (int j = 0; j < m; j++) {
      if ((mask & (1 << j)) != 0) {
        zero[j] = false;
      } else {
        zero[j] = true;
      }
    }
    solve();
  }
}
void smart() {
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      if (arr[i][j] == 0) {
        zero[j] = true;
      } else {
        zero[j] = false;
      }
    }
    solve();
  }
}
int main() {
  ans = 1000000000;
  scanf("%d %d %d", &n, &m, &k);
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < m; j++) {
      if (n >= m) {
        scanf("%d", &arr[i][j]);
      } else {
        scanf("%d", &arr[j][i]);
      }
    }
  }
  if (m > n) {
    swap(n, m);
  }
  if (n > k) {
    smart();
  } else {
    brut();
  }
  if (ans > k) {
    printf("-1\n");
  } else {
    printf("%d\n", ans);
  }
  return 0;
}
