Cod sursa(job #1866773)

Utilizator TincaMateiTinca Matei TincaMatei Data 3 februarie 2017 15:29:02
Problema Copii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <cstdio>

FILE *fout = fopen("copii.out", "w");

int v[20], top;

int adiac[11][11];
int blat[11];

inline void baga(int x, int baltagul) {
  blat[x] = baltagul;
}

inline int lastbit(int x) {
  return x & -x;
}

int kek[(1<<10)];
int n;

int boss[11];
int mor[11][11];
int rez;

void bkt(int stare, int last, int dep) {
  if(stare == 0) {
    int ramase = dep * (dep - 1);
    baga(last, dep);
    for(int i = 1; i <= dep; ++i)
      boss[i] = dep - 1;
    for(int i = 1; i <= dep; ++i)
      for(int j = 1; j <= dep; ++j)
        mor[i][j] = 0;

    for(int i = 0; i < n; ++i)
      for(int j = 0; j < n; ++j)
        if(blat[i] == blat[j] && mor[blat[i]][blat[j]] == 0) {
          ramase--;
          mor[blat[i]][blat[j]] = 1;
        }
    if(ramase == 0)
      rez++;
  } else {
    baga(last, dep);
    for(int i = last + 1; i < n; ++i)
      if(stare & (1 << i))
        bkt(stare ^ (1 << i), i, dep);
    bkt(stare ^ lastbit(stare), kek[lastbit(stare)], dep + 1);
  }
}

int main() {
  char ch;
  for(int i = 0; i < 10; ++i)
    kek[1 << i] = i;
  FILE *fin = fopen("copii.in", "r");
  fscanf(fin, "%d", &n);
  for(int i = 0; i < n; ++i) {
    ch = fgetc(fin);
    while(ch == ' ' || ch == '\n')
      ch = fgetc(fin);
    for(int j = 0; j < n; ++j) {
      adiac[i][j] = ch;
      ch = fgetc(fin);
    }
  }
  bkt((1 << n) - 2, 0, 1);
  fprintf(fout, "%d", rez);
  fclose(fin);
  fclose(fout);
  return 0;
}