Cod sursa(job #70730)

Utilizator moga_florianFlorian MOGA moga_florian Data 6 iulie 2007 23:50:08
Problema Invers Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 kb
#include<stdio.h>

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

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

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';           
    A[N]=V[N];
    ch=fgetc(fin);
    }
    
 if( verif(1,N) )
    fprintf(fout,"DA\n");
 else
 if( V[1]==1 && N>1 && V[2]<9 )
    {
    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;       
}