Pagini recente » Cod sursa (job #1001203) | Cod sursa (job #3121786) | Cod sursa (job #1241993) | Cod sursa (job #3254287) | Cod sursa (job #421000)
Cod sursa(job #421000)
Utilizator |
Gheorghe Cosmin gcosmin |
Data |
20 martie 2010 22:15:39 |
Problema |
Copii |
Scor |
Ascuns |
Compilator |
cpp |
Status |
done |
Runda |
|
Marime |
1.19 kb |
#include <stdio.h>
#include <vector>
#include <bitset>
using namespace std;
int N;
bitset <20> leg[20];
int ng = 0, rez = 0;
vector <int> gg[20];
bitset <20> gg1[20];
void back(int k)
{
int i, j;
if (k == N + 1) {
// trebuie sa vad daca e buna treaba sau nu
int e = 1;
for (i = 1; i <= ng && e; i++) {
bitset <20> pr = 0;
for (vector <int> :: iterator it = gg[i].begin(); it != gg[i].end(); ++it) pr |= leg[*it];
for (j = 1; j <= ng; j++) {
if (i == j) continue;
if ((pr & gg1[j]) == 0) { e = 0; break; }
}
}
rez += e;
return;
}
// trebuie sa fac pentru asta d-aia... partitionare
// bag in una existenta
for (i = 1; i <= ng; i++) {
gg[i].push_back(k);
gg1[i][k] = 1;
back(k + 1);
gg[i].pop_back();
gg1[i][k] = 0;
}
ng++;
gg[ng].push_back(k);
gg1[ng][k] = 1;
back(k + 1);
gg[ng].pop_back();
gg1[ng][k] = 0;
ng--;
}
int main()
{
int i, j;
char c;
freopen("copii.in", "r", stdin);
freopen("copii.out", "w", stdout);
scanf("%d\n", &N);
for (i = 1; i <= N; i++) {
for (j = 1; j <= N; j++) {
scanf(" %c", &c);
leg[i][j] = c == '1';
}
}
back(1);
rez--; // nu pot sa ii iau pe toti
printf("%d\n", rez);
return 0;
}