Cod sursa(job #560525)

Utilizator andreyeneEne Andrey andreyene Data 18 martie 2011 15:51:28
Problema Invers Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.08 kb
#include <cstdio>
using namespace std;
int n,v[10002];
char s[10002];
int ok ()
{
int st = 1, dr = n, i, d;
while (1)
{
d = v[st] - v[dr];
if (d != 0 && d != 1  && d != 10 && d != 11) return 0;
if (st == dr) return v[st] % 2 == 0;
if (st == dr - 1) return (v[st] == v[dr]) || (v[st] == v[dr] + 11);
if (d == 1 || d == 11) v[st + 1] += 10; // primeste transport de la v[st+1]
if (d >= 10 && v[dr] == 9) return 0;
if (d >= 10) // scade v[dr-1] deoarece a primit transport
{
for (i = dr - 1; v[i] == 0; i --) v[i] = 9;
v[i] --;
if (i == st) return 0;
}
st ++, dr --;
}
}
int rez ()
{
int i;
if (n == 1) return s[1]%2==0;
for (i = 1; i <= n; i ++) v[i] = s[i];
if (v[1] != 1 || v[n])
if (ok ()) return 1;
if (v[1] != 1) return 0;
for (i = 2; i <= n; i ++) v[i - 1] = s[i];
v[1] += 10;
n --;
return ok ();
}
int main ()
{
freopen ("invers.in", "r", stdin);
freopen ("invers.out", "w", stdout);
int t;
scanf ("%d\n", &t);
while (t --)
{
gets (s + 1);
for (n = 1; s[n]; n ++) s[n] -= '0';
n --;
if (rez ()) printf ("DA\n");
else printf ("NU\n");
}
return 0;
}