Cod sursa(job #1229085)

Utilizator tudormaximTudor Maxim tudormaxim Data 16 septembrie 2014 12:52:04
Problema Invers Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.37 kb
#include <cstdio>
int n, a[10005], b[10005];
bool solve(int st, int dr) {
  int i, dc;

  while (1) {
    if (st == dr) return (1 - (a[st] % 2));
    if (st == dr - 1) return (a[st] == a[dr] || a[st] == a[dr] + 11);
    dc = a[st] - a[dr];
    if (dc != 0 && dc != 1 && dc != 10 && dc != 11) return 0;
    if (dc == 1 || dc == 11) a[st + 1] += 10;
    if (dc >= 10) {
      if (a[dr] == 9) return 0;
      int i;
      for (i = dr - 1; a[i] == 0; -- i)
        a[i] = 9;
      a[i] --;
      if (i == st)return 0;
    }

    ++ st;
    -- dr;
  }
}

int main() {
  freopen("invers.in", "r", stdin);
  freopen("invers.out", "w", stdout);
  int t = 0;
  scanf("%d\n", &t);
  for (; t>0; t--) {
    char s[10005];
    gets(s);
    n = 0;
    for (int i = 0; s[i]; ++ i) {
        ++ n;
        a[n] = b[n] = s[i] - '0';
    }
    if (n == 1) {
      if (a[1] % 2 == 1) {
        printf("NU\n");
        continue;
      }

      printf("DA\n");
      continue;
    }

    if (a[n] > 0)
      if (solve(1, n)) {
        printf("DA\n");
        continue;
      }

    if (a[1] != 1) {
      printf("NU\n");
      continue;
    }

    for (int i = 1; i < n; ++ i)
      a[i] = b[i + 1];

    a[1] += 10;

    if  (solve(1, n - 1))
      printf("DA\n");
    else
      printf("NU\n");
  }
  fclose(stdin);
  fclose(stdout);
  return 0;
}