Pagini recente » Cod sursa (job #1505511) | Cod sursa (job #1122855) | Cod sursa (job #1251080) | Cod sursa (job #1410213) | Cod sursa (job #997394)
Cod sursa(job #997394)
#include <iostream>
#include <fstream>
#define NMax 16
using namespace std;
int n, nrSub, st[NMax];
int sol;
char a[NMax][NMax];
bool prieten[NMax][NMax];
inline void Read()
{
ifstream f ("copii.in");
f>>n;
int i, j;
for (i=1; i<=n; ++i)
f>>(a[i]+1);
f.close();
for (i=1; i<=n; ++i)
for (j=1; j<=n; ++j)
prieten[i][j] = (a[i][j] == '1');
}
inline void Verif()
{
if (nrSub == 1)
return ;
bool mat[NMax][NMax];
/// mat[i][j] = true daca echipa j are cel putin un copil in multimea de prieteni a echipei i
int i, j;
for (i=1; i<=n; ++i)
for (j=1; j<=n; ++j)
mat[i][j] = false;
for (i=1; i<=n; ++i)
for (j=1; j<=n; ++j)
if (prieten[i][j]) /// daca copiii i si j sunt prieteni atunci echipa copilului j are cel putin un copil
mat[st[i]][st[j]] = true; /// in multimea de prieteni a copilului i si acel copil este j
for (i=1; i<=nrSub; ++i)
for (j=1; j<=nrSub; ++j)
if (i!=j && !mat[i][j]) /// daca am gasit o multime j care nu are niciun copil in multimea de prieteni a echipei i
return ;
++sol;
}
inline void Back(int k)
{
if (k == n+1)
{
Verif();
return ;
}
for (int i = 1; i<=nrSub; ++i)
{
st[k] = i;
Back(k+1);
}
++nrSub;
st[k] = nrSub;
Back(k+1);
--nrSub;
}
inline void Write()
{
ofstream g("copii.out");
g<<sol<<"\n";
g.close();
}
int main()
{
Read();
Back(1);
Write();
return 0;
}