Cod sursa(job #58529)

Utilizator Binary_FireFlorin Pogocsan Binary_Fire Data 6 mai 2007 12:05:50
Problema Invers Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.26 kb
#include<fstream.h>
#include<iomanip.h>
#include<string.h>

char nr[1000000];
int v[1000000];
long t;

void transf(int);
int verificare(int);
void caz1(int,int);
int caz2(int,int);
void scadere(int);
int bun(int,int,int);
int nr_nubun(int);

int main()
{int i,e,k,lung;
 char ch;
 fstream f("invers.in",ios::in);
 fstream f1("invers.out",ios::out);
 f>>t;
 for (i=1;i<=t;i++)
   {f>>nr;
    lung=strlen(nr);
    transf(lung);
    e=verificare(lung);
    if (e) f1<<"DA\n"; //<<nr<<endl;
    else f1<<"NU\n"; //<<nr<<endl;
   }
 f1.close();
 f.close();
 return 0;
 }
 
void transf(int n)
{int i;
 for (i=0;i<n;i++) v[i+1]=(int)nr[i]-48;}
 
int verificare(int n)
{int ok=1,s=1,d=n,nr,i,inv;
 if (n==1) {if (v[1]%2!=0) ok=0;}
 else if (n==2) {nr=v[1]*10+v[2];ok=0;
                 for (i=5;i<nr;i++)
                   {if (i<10) inv=i;
                    else inv=i%10*10+i/10;
                    if (i+inv==nr) ok=1;} 
                 }
      else 
 {if (nr_nubun(n)) ok=0;
  if (v[1]==1 && bun(1,n,n)) {v[2]=v[2]+10;s=2;}
  while (s!=d && d!=s+1 && ok)
  {if (v[s]==v[d]+1) caz1(s,d);
   else if (v[s]==v[d]+10) ok=caz2(s,d);
        else if (v[s]==v[d]+11) {caz1(s,d);ok=caz2(s,d);}
             else if (v[s]==v[d]);
                  else ok=0; 
   s=s+1;d=d-1;
   }
   if (s==d && ok) if (v[s]%2!=0) ok=0;
   if (d==s+1 && ok) {if (v[s]==v[d]) ok=1;
                      else if (v[s]==v[d]+11) ok=1;
                           else ok=0;}
 } 
 return ok;
 }
 
void caz1(int s,int d)
{v[s+1]=v[s+1]+10;}

int caz2(int s,int d)
{int ok=1;
 if (v[s]==19 && v[d]==9) ok=0;   
 else if (v[d-1]==0) {v[d-1]=9;scadere(d-2);}
      else v[d-1]--;
 return ok;}

void scadere(int poz)
{if (v[poz]==0) {v[poz]=9;scadere(poz-1);}
 else v[poz]--;
 }

int bun(int s,int d,int n)
{if (s==d && ((v[s]==1 && v[s-1]==1 && v[d+1]==1)||v[s]%2!=0)) return 1; 
 if (s==1 && v[d]!=1) return 1;
 if ((s==d && v[s]%2==0)||(d==s-1)) return 0; 
 if ((v[s]==v[d] && n%2==0) || ((v[s]==v[d]+1 || v[s]==v[d]) && n%2!=0)) return bun(s+1,d-1,n);
 else return 1;
 }
 
int nr_nubun(int lung)
{int ok=0,s=1,d=lung;
 if (v[s]==1 && v[s+1]==0 && v[d]==0 && v[d-1]==0) 
   {ok=1;
    while (s!=d-1) {if (v[s]!=0) ok=0; s++;}
    }
 return ok;
 }