Cod sursa(job #1229079)

Utilizator tudormaximTudor Maxim tudormaxim Data 16 septembrie 2014 12:42:48
Problema Invers Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <cstdio>
#include <iostream>
#include <string>
#define nmax 10005
int n, a[nmax], b[nmax];
using namespace std;
bool solve(int st, int dr)
{
    int 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 ;
    scanf("%d", &t);
    for (;t> 0; --t)
    {
        string s;
        getline(cin,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;
}