Cod sursa(job #56432)

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

int T,dim;
char a[Nmax];

void steal(int p,char v[]) {
	v[p]--;
	if (v[p]<0) {
		v[p]=9;
		if (p>0) steal(p-1,v);
	}
}

int test(int i,int j,char v[]) {
int good;	

		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,v);
					
				}
				
				else
					if ( v[i] == v[j] + 11 ) {
						
						if ( v[i]==19 )
							good=0;

						v[i+1]+=10;

						steal(j-1,v);

					}

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

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

		return good;
}

int main() {
int good;
char tmp[Nmax];

	freopen(fin,"r",stdin); freopen(fout,"w",stdout);

	scanf("%d",&T);

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

		for (dim=0;a[dim]!=(char)NULL;++dim) {
			a[dim]-='0';
			tmp[dim]=a[dim];
		}
				
		dim--;

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

		if (a[0]==1 && dim>1) {
			a[1]+=10;
			good=test(1,dim,a);
			if (!good)
				good=test(0,dim,tmp);
		}
		else 
			good=test(0,dim,a);

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

	}	

	fclose(stdin); fclose(stdout);

	return 0;
}