Cod sursa(job #995593)

Utilizator cvicentiuCiorbaru Vicentiu Marian cvicentiu Data 9 septembrie 2013 19:51:54
Problema Generare de permutari Scor 80
Compilator c Status done
Runda Arhiva educationala Marime 1.23 kb
#include <stdio.h>
#include <stdlib.h>
FILE *f;
FILE *g;

int valid(int stack[8], int head, int max)
{
  int i;

  if (stack[head] > max)
    return 0;

  for (i = 0; i < head; i++)
  {
    if (stack[head] == stack[i])
      return 0;
  }
  return 1;
}

void perm(int n)
{
  int stack[8];
  stack[0] = 1;
  int head = 0;
  int i;
  if (n > 8)
  {
    return;
  }

  while (head >= 0)
  {
    for (i = 0; i <= head; i++)
      printf("%d ", stack[i]);
    // AFISARE SOLUTIE FINALA
    if (head == n - 1 && valid(stack, head, n)) {
      for (i = 0; i <= head; i++) {
        fprintf(g, "%d ", stack[i]);
      }
      fprintf(g, "\n");

      stack[head]++;
      continue;
    }

    //INCERCAM PE ACELASI NIVEL, ALTA SOLUTIE
    if (!valid(stack, head, n) && stack[head] <= n)
    {
      stack[head]++;
      continue;
    }

    //ULTIMA SOLUTIE INCERCATA SI NU ESTE VALID
    if (!valid(stack, head, n) && stack[head] > n)
    {
      head--;
      stack[head]++;
      continue;
    }

    if (valid(stack, head, n))
    {
      head++;
      stack[head] = 1;

      continue;
    }
  }

  return;
}

int main() {
  int n;

  f = fopen("permutari.in", "r");
  g = fopen("permutari.out", "w");

  fscanf(f, "%d", &n);
  perm(n);

  fclose(f);
  fclose(g);

}