Cod sursa(job #145174)

Utilizator katakunaCazacu Alexandru katakuna Data 28 februarie 2008 16:00:12
Problema Castel Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.82 kb
#include<stdio.h>   
  
int oo,l,po[200][150],ok,ka,ce[20000],j,x,y,n,m,k,i,p,u,c[20000],a[20000],d[5]={-1,1};

char viz[20000];

int main(){   
FILE *f=fopen("castel.in","r");   
fscanf(f,"%d %d %d",&n,&m,&k);   

 for(i=1;i<=n*m;i++){
 fscanf(f,"%d",&a[i]);

 }

fclose(f);

  c[1]=k;
  ce[k]=1;
  viz[k]=-1;

d[2]=m;
d[3]=-m;

  p=1;
  u=1;



    while(p<=u){
    ok=0;


    if(po[0][c[p]]>0){

	      for(l=1;l<=po[0][c[p]]>0;l++){
	      u++;
	      c[ u ]=po[l][c[p]];
	      ce[po[l][c[p]] ]=1;
	      //viz[c[p]]=-1;
	      }

     po[0][c[p]]=0;
     }

      for(i=0;i<=1;i++){


      if(c[p]%m==0){
      x=c[p]/m-1;
      }
      else x=c[p]/m;


      if((c[p]+d[i])%m==0){
      y=(c[p]+d[i])/m-1;
      }
      else y=(c[p]+d[i])/m;



      if(x==y&&viz[c[p]+d[i]]!=-1){

	if(ce[ a[c[p]+d[i]] ]==1){

	u++;
	c[ u ]=c[p]+d[i];
	viz[c[p]+d[i]]=-1;
	ce[ c[p]+d[i]]=1;
       //	ok=1;

	/*   if(po[0][c[p]+d[i]]>0){

	      for(l=1;l<=po[0][c[p]+d[i]]>0;l++){
	      u++;
	      c[ u ]=po[l][c[p]+d[i]];
	      //viz[c[p]+d[i]]=-1;
	      }


	   po[0][c[p]+d[i]]=0;

	   }

          */
	}

	else{

	 po[0][ a[c[p]+d[i]] ]++;

	 oo=po[0][ a[c[p]+d[i]] ];
	 po [ oo ][ a[c[p]+d[i]] ]=c[p]+d[i] ;

	 viz[c[p]+d[i]]=-1;

	}


      }


      }

      for(i=2;i<=3;i++){


	if(c[p]+d[i]>=1&&c[p]+d[i]<=n*m&&viz[c[p]+d[i]]!=-1){

	 if( ce[ a[c[p]+d[i]] ]==1){
	 u++;
	 c[ u ]=c[p]+d[i];
	 viz[c[p]+d[i]]=-1;
	 ce[ c[p]+d[i]]=1;





	 // ok=1;
	 }


	 else{

	 po[0][ a[c[p]+d[i]] ]++;

	 oo=po[0][ a[c[p]+d[i]] ];
	 po[oo][ a[c[p]+d[i]] ]=c[p]+d[i];

	 viz[c[p]+d[i]]=-1;

	 }

       }


      }
    // if(ok)p=0;
    p++;
    }

FILE *g=fopen("castel.out","w");
fprintf(g,"%d",u);
fclose(g);

return 0;
}