Cod sursa(job #2401409)

Utilizator juniorOvidiu Rosca junior Data 9 aprilie 2019 18:08:15
Problema Diamant Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.57 kb
// 100 p
// Daca nu se pune conditia de la [2] se obtine Killed by signal 11(SIGSEGV),
// atunci cand se utilizeaza un indice care iese din limitele declarate pentru a si b.

#include <stdio.h>
#include <string.h>

short a[90001], b[90001];
int l, c, z, nl, nc, x, va, vb, ln, lp, n, p;

int main () {
  freopen("diamant.in" ,"r",stdin);
  freopen("diamant.out","w",stdout);
  scanf("%d %d %d", &nl, &nc, &x);
  if (x > 44100) // [2]
    printf("0");
  else {
    a[45000] = 1;
    ln = 45000; lp = 45000; // limita "negativa" si limita "pozitiva"
    for (l = 1; l <= nl; l++) {
      for (c = 1; c <= nc; c++) {
        memcpy(b, a, sizeof(a));
        memset(a, 0, sizeof(a));
        for (vb = ln; vb <= lp; vb++) { // [1]
          n = vb-l*c; // pentru valorile "negative"
          a[n] += b[vb];
          if (a[n] >= 10000)
            a[n] -= 10000;
          a[vb] += b[vb];
          if (a[vb] >= 10000)
            a[vb] -= 10000;
          p = vb+l*c; // pentru valorile "pozitive"
          a[p] += b[vb];
          if (a[p] >= 10000)
            a[p] -= 10000;
        }
        ln -= l*c; lp += l*c;
      }
    }
    printf("%d", a[x+45000]);
  }
  return 0;
}

/*

[1] Valorile din b contribuie la aparitia anumitor valori in a.
[2] Valoarea maxima care se poate obtine pentru un diamant este 44100,
    daca pe toate patratelele avem +1.


1,1
       -1  0  1
        1  1  1

1,2
 -3 -2 -1  0  1  2  3
  0  0  0  0  1  1  1
  0  0  1  1  2  1  1
  1  1  2  1  2  1  1

2,1
 -3 -2 -1  0  1  2  3
  1  1  2  1  2  1  1
*/