Cod sursa(job #70768)

Utilizator moga_florianFlorian MOGA moga_florian Data 7 iulie 2007 11:14:11
Problema Invers Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.7 kb
#include<stdio.h>

int V[10005];
int A[10005];

int verif(int st,int dr)
{
int i;
    
if(dr-st+1==0)
  return 1;
  
 while(st != dr-1 && st!=dr)
   {
   if(A[st] - A[dr] == 0);
   else
   if(A[st] - A[dr] == 1)
      A[st+1]+=10;
   else
   if(A[st] - A[dr] == 10)
      {
      if(A[st]==19) 
           return 0;            
           
      i=dr-1;
      while(A[i]==0) 
           {
           A[i]=9;
           i--;      
           }
      A[i]--;
      
      if(i==st) 
        return 0;    
      }
   else
   if(A[st] - A[dr] == 11)
      {
      A[st+1]+=10;
            
      i=dr-1;
      while(A[i]==0) 
           {
           A[i]=9;
           i--;      
           }
      A[i]--;
      }
   else
      return 0;
         
   st++;dr--;   
   }
      
   if(st==dr && A[st]%2 )
         return 0;
   else
   if(st==dr-1 && A[st]!=A[dr] && A[st]-A[dr]!=11)
         return 0;
    
return 1;
}

int main()
{
FILE *fin=fopen("invers.in","r"),
     *fout=fopen("invers.out","w");
     
int T,i,N;
char ch;
fscanf(fin,"%d\n",&T);

while(T--)
 {
 N=0;
 ch=fgetc(fin);
 while(ch!='\n' && ch!=EOF)
    {
    V[++N]= ch-'0';          
    if(N==1 && V[1]==0) N--;
    A[N]=V[N];
    ch=fgetc(fin);
    if(ch=='\r') for(;;);
    }
  
// if(N>1 && V[1]==0)
//   fprintf(fout,"NU\n");
// else    
 if( verif(1,N) )
    fprintf(fout,"DA\n");
 else
 if( V[1]==1 && N>1 )
    {
    for(i=2;i<=N;i++)
       A[i-1]=V[i];
    A[1]+=10;
    
    if(verif(1,N-1))
       fprintf(fout,"DA\n");         
    else
       fprintf(fout,"NU\n");
    }
 else
 fprintf(fout,"NU\n");    
 } 
 
fclose(fin);
fclose(fout);
return 0;       
}