Cod sursa(job #484126)

Utilizator GheorgheMihaiMihai Gheorghe GheorgheMihai Data 12 septembrie 2010 11:57:28
Problema Invers Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <stdio.h>

int n;
int 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;

		if (d >= 10 && v[dr] == 9)
			return 0;
		if (d >= 10)
		{
			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;
}