Pagini recente » Cod sursa (job #2446048) | Cod sursa (job #2385556) | Cod sursa (job #2752469) | Cod sursa (job #2564898) | Cod sursa (job #1857068)
#include <fstream>
#include <vector>
#include <cstring>
#include <cassert>
using namespace std;
const int MAXN = 15;
int N, Sol;
char A[MAXN][MAXN];
vector <int> grup[MAXN];
int g[MAXN];
void back(int k, int ng) {
if (k > N) {
if (ng < 2)
return;
int u[MAXN];
memset(u, 0, sizeof(u));
for (int i = 1; i <= ng; ++i) {
for (size_t j = 0; j < grup[i].size(); ++j)
for (int k = 1; k <= N; ++k)
if (A[grup[i][j]][k] == '1')
u[g[k]] = i;
for (int j = 1; j <= ng; ++j)
if (u[j] != i && i != j)
return;
}
++Sol;
return;
}
for (int i = 1; i <= ng; ++i) {
grup[i].push_back(k);
g[k] = i;
back(k + 1, ng);
grup[i].pop_back();
}
grup[++ng].push_back(k);
g[k] = ng;
back(k + 1, ng);
grup[ng--].pop_back();
}
int main() {
ifstream fin("copii.in");
ofstream fout("copii.out");
fin >> N;
assert(1 <= N && N <= 10);
for (int i = 1; i <= N; ++i) {
fin >> (A[i] + 1);
for (int j = 1; j <= N; ++j)
assert('0' <= A[i][j] && A[i][j] <= '1');
}
back(1, 0);
fout << Sol << endl;
return 0;
}