Cod sursa(job #56418)

Utilizator Binary_FireFlorin Pogocsan Binary_Fire Data 29 aprilie 2007 15:46:05
Problema Invers Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <stdio.h>
#define fin  "invers.in"
#define fout "invers.out"
#define Nmax 10002

int T,dim;
char v[Nmax];

int absf(int a) {
	if (a<0)
		a*=-1;
	return a;
}

void steal(int p) {
	v[p]--;
	if (v[p]<0) {
		v[p]=9;
		if (p>0) steal(p-1);
	}
}
int main() {
int i,j,good;
	freopen(fin,"r",stdin); freopen(fout,"w",stdout);

	scanf("%d",&T);

	for (;T>0;--T) {
		
		scanf("%s",&v);	

		for (dim=0;v[dim]!=(char)NULL;++dim)
			v[dim]-='0';
		
		dim--;

		//fprintf(stderr,"%d\n",dim);

		if (v[0]==1 && dim>1) {
			v[1]+=10;
			i=1;
		}
		else 
			i=0;

		j=dim;

		for (good=1;i<=j && good;++i,--j) {
			
			//fprintf(stderr,"%d %d\n",v[i],v[j]);

			if (i==j && v[i]%2!=0)
				good=0;

			if (i+1==j && v[i]!=v[j] && v[i]!=v[j]+11)
				good=0;

			if ( v[i] == v[j] + 1 ) 
				v[i+1]+=10;
			else
				if ( v[i] == v[j] + 10 ) {

					if ( v[i]==19 )
						good=0;

					steal(j-1);
					
				}
				
				else
					if ( v[i] == v[j] + 11 ) {
						
						if ( v[i]==19 )
							good=0;

						v[i+1]+=10;

						steal(j-1);

					}

					else
						if ( v[i] != v[j] )

							good=0;
			//fprintf(stderr,"%d %d\n",i,j);
		}

		if (good)
			printf("DA\n");
		else
			printf("NU\n");

	}	

	fclose(stdin); fclose(stdout);

	return 0;
}