Pagini recente » Cod sursa (job #1222757) | Cod sursa (job #683470) | Cod sursa (job #2753704) | Cod sursa (job #538211) | Cod sursa (job #1631831)
#include <fstream>
#include <cstring>
using namespace std;
FILE *fin, *fout;
int n, nrp, p[15], nrsol, np[15];
bool A[15][15];
char c;
void gen(int k);
bool verifica();
int main()
{
int i, j;
fin = fopen("copii.in", "r");
fout = fopen("copii.out", "w");
fscanf(fin, "%d\n", &n);
for (i = 1; i <= n; i++)
{
for (j = 1; j <= n; j++)
{
fscanf(fin, "%c", &c);
A[i][j] = c - '0';
}
fscanf(fin, "\n");
}
gen(1);
fprintf(fout, "%d\n", nrsol);
fclose(fout);
return 0;
}
void gen(int k)
{
int i;
if (k == n + 1)
{
if (verifica())
nrsol++;
}
else
{
for (i = 1; i <= nrp; i++)
{
p[k] = i;
np[i]++;
gen(k + 1);
np[i]--;
}
p[k] = nrp + 1;
nrp++;
np[nrp]++;
gen(k + 1);
np[nrp]--;
nrp--;
}
}
bool verifica()
{
int T[15][15], i, j;
if (nrp == 1)
return 0;
for (i = 1; i <= n; ++i)
{
for (j = 0; j <= n; ++j)
T[i][j] = 0;
}
for (i = 1; i <= n; ++i)
{
for (j = 1; j <= n; ++j)
{
if (A[j][i] && !T[p[j]][p[i]] && p[j] != p[i])
{
T[p[j]][0]++;
T[p[j]][p[i]] = 1;
}
}
}
for (i = 1; i <= nrp; ++i)
{
if (T[i][0] < nrp - 1)
return 0;
}
return 1;
}