Cod sursa(job #456)

Utilizator bogdan2412Bogdan-Cristian Tataroiu bogdan2412 Data 11 decembrie 2006 12:36:46
Problema Invers Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <stdio.h>
#include <string.h>

int T;
char s[10005], s2[10005];

int tryit(int l, int n)
{
    int i, j, k;
    for (i = l, j = n - 1; 1; i++, j--)
    {
        if (i == j)
            return s[i] % 2 == 0;
        if (j - i == 1)
            return s[i] == s[j] || (s[i] == s[j] + 11);
        switch (s[i] - s[j])
        {
            case 0: break;
            case 1: s[i + 1] += 10; break;
            case 11:
                s[i + 1] += 10;
            case 10:
                if (s[j] == 9) return 0;
                for (s[k = j - 1]--; s[k] < 0 && k >= i; )
                   s[k] += 10, s[--k]--;
                if (k == i) return 0;
                break;
            default: return 0;
        }
    }
}

int doit()
{
    int n, i, j, k;
    for (n = 0; s[n]; n++) s[n] -= '0';
    if (n == 1) return (s[0]) % 2 == 0;
    if (n == 2) return (s[0] == s[1]) || (s[0] == 1 && s[1] % 2 == 0);
    if (s[0] == 1)
    {
        memcpy(s2, s, sizeof(s));
        s[1] += 10;
        if (tryit(1, n))
            return 1;
        else
            if (s[0] == 1 && s[n - 1] == 0)
                return 0;
            else
            {
                memcpy(s, s2, sizeof(s2));
                return tryit(0, n);
            }
    }
    else
        return tryit(0, n);
    return 0;
}

int main()
{
    freopen("invers.in", "rt", stdin);
    freopen("invers.out", "wt", stdout);
    for (scanf("%d", &T), gets(s); T; T--)
    {
        gets(s);
        printf("%s\n", doit() ? "DA" : "NU");
    }
    return 0;
}