Cod sursa(job #1403349)

Utilizator stefanzzzStefan Popa stefanzzz Data 27 martie 2015 11:09:05
Problema Invers Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <stdio.h>
#include <string.h>
#define MAXC 10020
using namespace std;

int nrt, n;
char v[MAXC];

bool solve(int st, int dr, bool type){
	int ans = 2;

	//printf("%d %d %d\n", st, dr, type);

	if(st == dr)
		return (v[st] % 2 == 0);
	
	if(type == 1 && v[dr] == v[st] && v[dr] == 9) return 0;

	if(dr - st == 1){
		if(type)
			return v[st] == v[dr] + 1;
		else
			return v[st] == v[dr];
	}

	if(v[dr] != v[st] && (v[dr] + 1) % 10 != v[st]) return 0;

	if(type == 1 && (v[st] == v[dr] || v[dr] < 9)){
		v[dr - 1]--;
		int j;
		for(j = dr - 1; j > st + 1 && v[j] == -1; j--){ //???
			v[j] = 9;
			v[j - 1]--;
		}
		if(v[j] == -1)
			ans = 0;
	}

	if(ans == 3){
		if(v[st] == v[dr])
			ans = solve(st + 1, dr - 1, 0);
		else
			ans = solve(st + 1, dr - 1, 1); 
	}

	if(type == 1 && (v[st] == v[dr] || v[dr] < 9)){
		v[dr - 1]++;
		for(int j = dr - 1; j > st + 1 && v[j] == 10; j--){
			v[j] = 0;
			v[j - 1]++;
		}
	}

	return ans;
}

	


int main(){
	freopen("invers.in", "r", stdin);
	freopen("invers.out", "w", stdout);

	int i;

	scanf("%d\n", &nrt);
	while(nrt--){
		fgets(v + 1, MAXC, stdin);
		n = strlen(v + 1) - 1;
		
		for(i = 1; i <= n; i++)
			v[i] -= '0';

		if(solve(1, n, 0)){
			printf("DA\n");
			continue;
		}

		if(v[1] == 1 && solve(2, n, 1)){
			printf("DA\n");
			continue;
		}
		printf("NU\n");
	}

	return 0;
}