Cod sursa(job #1686127)

Utilizator ionut98Bejenariu Ionut Daniel ionut98 Data 12 aprilie 2016 08:39:19
Problema Invers Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.56 kb
#include<fstream>
#include<cstring>
using namespace std;
ifstream f("invers.in");
ofstream g("invers.out");
int n,a[10005],b[10005];
bool solve(int st,int dr)
{
    int i,dc;
    while(1)
    {
        if(st==dr)
          return (1-(a[st]%2));
        if(st==dr-1)
          return(a[st]==a[dr]||a[st]==a[dr]+11);
        dc=a[st]-a[dr];
        if(dc!=0&&dc!=1&&dc!=10&&dc!=11)
          return 0;
        if(dc==1||dc==11)
          a[st+1]+=10;
        if(dc>=10)
        {
            if(a[dr]==9)
              return 0;
            int i;
            for(i=dr-1;a[i]==0;--i)
              a[i]=9;
            a[i]--;
            if(i==st)
              return 0;
        }
        ++st;
        --dr;
    }
}
int main()
{
    int t=0;
    f>>t;
    for(;t>0;t--)
    {
        char s[10005];
        gets(s);
        n=0;
        for(int i=0;s[i];++i)
        {
            ++n;
            a[n]=b[n]=s[i]-'0';
        }
        if(n==1)
        {
            if(a[1]%2==1)
            {
                printf("NU\n");
                continue;
            }
            printf("DA\n");
            continue;
        }
        if(a[n]>0)
          if(solve(1,n))
          {
              printf("DA\n");
              continue;
          }
        if(a[1]!=1)
        {
            printf("NU\n");
            continue;
        }
        for(int i=1;i<n;++i)
          a[i]=b[i+1];
        a[1]+=10;
        if(solve(1,n-1))
          printf("DA\n");
        else
          printf("NU\n");
    }
  return 0;
}