Cod sursa(job #2024318)

Utilizator ionutpop118Pop Ioan Cristian ionutpop118 Data 20 septembrie 2017 13:04:06
Problema Copii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <cstdio>
#include <cstring>
using namespace std;
const int NMAX = 10;
char f[NMAX + 5][NMAX + 5];
bool ok[NMAX + 5][NMAX + 5];
int p[NMAX + 5], ans, n;
bool valid(int nr)
{
    for (int i = 1; i <= nr; ++i)
        for (int j = 1; j <= nr; ++j)
            ok[i][j] = 0;
    for (int i = 1; i <= n; ++i)
        for (int j = i + 1; j <= n; ++j)
            if (p[i] != p[j])
            {
                if (f[i][j] == '1')
                    ok[p[j]][p[i]] = 1;
                if (f[j][i] == '1')
                    ok[p[i]][p[j]] = 1;
            }
    for (int i = 1; i <= nr; ++i)
        for (int j = 1; j <= nr; ++j)
            if (ok[i][j] == 0 && i != j)
                return 0;

    return 1;
}
void backt(int poz, int nr)
{
    if (poz == n + 1)
    {
        ans += valid(nr);
        return ;
    }

    for (int i = 1; i <= nr; ++i)
    {
        p[poz] = i;
        backt(poz + 1, nr);
    }
    p[poz] = nr + 1;
    backt(poz + 1, nr + 1);
}
int main()
{
    freopen("copii.in", "r", stdin);
    freopen("copii.out", "w", stdout);

    scanf("%d\n", &n);
    for (int i = 1; i <= n; ++i)
        gets(f[i] + 1);
    backt(1, 0);
    printf("%d\n", ans - 1);
    return 0;
}