#include <iostream>
#include <set>
#include <vector>
#include <algorithm>
using namespace std;
int n, m, tar;
bool a[10][10];
set<string> seen;
string to_string_matrix(bool mat[10][10]) {
string res;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
res += a[i][j] ? '1' : '0';
}
}
return res;
}
string rotate_90(const string &s) {
string t(n * m, '0');
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
t[j * n + (n - 1 - i)] = s[i * m + j];
}
}
return t;
}
string reflect_h(const string &s) {
string t = s;
for (int i = 0; i < n; i++) {
reverse(t.begin() + i * m, t.begin() + (i + 1) * m);
}
return t;
}
string reflect_v(const string &s) {
string t = s;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
t[(n - 1 - i) * m + j] = s[i * m + j];
}
}
return t;
}
string min_representation(string s) {
vector<string> variants;
variants.push_back(s);
variants.push_back(reflect_h(s));
variants.push_back(reflect_v(s));
string r = rotate_90(s);
variants.push_back(r);
variants.push_back(reflect_h(r));
variants.push_back(reflect_v(r));
r = rotate_90(r);
variants.push_back(r);
variants.push_back(reflect_h(r));
variants.push_back(reflect_v(r));
return *min_element(variants.begin(), variants.end());
}
bool check() {
for (int d = 1; d <= min(n, m) - 1; d++) {
for (int i = 0; i + d < n; i++) {
for (int j = 0; j + d < m; j++) {
if (a[i][j] && a[i + d][j] && a[i][j + d] && a[i + d][j + d]) {
return false;
}
}
}
}
return true;
}
int valid_count = 0;
void dfs(int i, int j, int k) {
if (j == m) {
i++;
j = 0;
}
if (i == n) {
if (k == tar && check()) {
string key = to_string_matrix(a);
string rep = min_representation(key);
if (seen.count(rep)) return; // 對稱解出現過就跳過
seen.insert(rep);
valid_count++;
for (int x = 0; x < n; x++) {
for (int y = 0; y < m; y++) {
cout << a[x][y] << " ";
}
cout << "\n";
}
cout << "--------\n";
}
return;
}
a[i][j] = 0;
dfs(i, j + 1, k);
if (k < tar) {
a[i][j] = 1;
dfs(i, j + 1, k + 1);
}
}
int main() {
cin >> n >> m >> tar;
dfs(0, 0, 0);
cout << "合法代表組合總數: " << valid_count << "\n";
}