Pagini recente » Cod sursa (job #2263773) | Cod sursa (job #1203016) | Cod sursa (job #2551394) | urmasiiluidoru | Cod sursa (job #1750923)
#include <fstream>
#include <vector>
#include <cstring>
#include <queue>
using namespace std;
ifstream cin("copii.in");
ofstream cout("copii.out");
const int MAXN = 10;
int n, answer = 0;
char a[1 + MAXN][1 + MAXN];
vector<int> group[1 + MAXN];
int which[1 + MAXN], seen[1 + MAXN];
bool Check(int groups) {
if (groups < 2)
return false;
memset(seen, 0, sizeof(seen));
for (int i = 1; i <= groups; i++) {
for (int j = 0; j < group[i].size(); j++)
for (int k = 1; k <= n; k++)
if (a[group[i][j]][k] == '1')
seen[which[k]] = i;
for (int j = 1; j <= groups; j++)
if (seen[j] != i && i != j)
return false;
}
return true;
}
void Backtracking(int child, int groups) {
if (child == n + 1) {
if (Check(groups))
answer++;
return;
}
for (int i = 1; i <= groups; i++) {
group[i].push_back(child);
which[child] = i;
Backtracking(child + 1, groups);
group[i].pop_back();
}
groups++;
group[groups].push_back(child);
which[child] = groups;
Backtracking(child + 1, groups);
group[groups].pop_back();
groups--;
}
int main() {
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i] + 1;
Backtracking(1, 0);
cout << answer << "\n";
return 0;
}