Pagini recente » Evacuare | Profil Duxar | Cod sursa (job #110848) | Mihnea Andreescu | Cod sursa (job #421876)
Cod sursa(job #421876)
#include <cstdio>
#include <cassert>
#include <cstring>
#include <algorithm>
using namespace std;
#define MAXN 10
int N; char m[MAXN][MAXN], ok[MAXN][MAXN];
int st[MAXN];
int NR = 0;
inline void back(int k, int Max = 0) {
if (k == N) {
if (Max == 1) {
return;
}
memset(ok, 0, sizeof(ok));
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (m[i][j]) {
ok[st[i]][st[j]] = 1;
}
}
}
for (int i = 1; i <= Max; i++) {
for (int j = 1; j <= Max; j++) {
if (i != j && !ok[i][j]) {
return;
}
}
}
NR += 1;
return;
}
for (int i = 1; i <= Max + 1; i++) {
st[k] = i;
back(k + 1, max(Max, i));
}
}
int main() {
freopen("copii.in", "rt", stdin);
#ifndef DEBUG
freopen("copii.out", "wt", stdout);
#endif
assert(scanf("%d", &N) == 1);
assert(1 <= N && N <= MAXN);
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
assert(scanf(" %c", m[i] + j));
assert(m[i][j] == '0' || m[i][j] == '1');
m[i][j] -= '0';
}
}
back(0);
printf("%d\n", NR);
return 0;
}