Cod sursa(job #363345)

Utilizator Cristi09Cristi Cristi09 Data 12 noiembrie 2009 20:33:03
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.92 kb
#include<stdio.h>
#define MAXINT 32000

int r,c,val=0,ok=1,xo,yo,sch=0;
struct ghj
{
   int val;
   int init;
}a[1002][1002];
struct nod
{
   int x,y,val;
   nod*leg;
}*prim,*p,*q;
void adauga(int i,int j);
void adaugaI(int i,int j);
int abs(int x);
int main()
{  //clrscr();
   prim=new nod;
   q=new nod;
   prim->leg=NULL;
   q=prim;
   FILE*f=fopen("barbar.in","r");
   fscanf(f,"%d%d",&r,&c);
   int i,j,xi,yi;

   char var;
   for(i=0;i<=r+1;++i)
   for(j=0;j<=c+1;++j)
   {
	   if(!i||!j||i==r+1||j==c+1){a[i][j].init=a[i][j].val=-MAXINT;continue;}
	   fscanf(f,"%c",&var);
	   if(var=='\n'){j--;continue;}
	   switch(var)
	   {
		  case '.':{a[i][j].init=a[i][j].val=MAXINT;break;}
		  case '*':{a[i][j].init=a[i][j].val=-MAXINT;break;}
		  case 'I':{a[i][j].init=a[i][j].val=MAXINT;xi=i;yi=j;break;}
		  case 'O':{a[i][j].init=a[i][j].val=MAXINT;xo=i;yo=j;break;}
		  case 'D':{
					  a[i][j].init=a[i][j].val=0;
					  p=new nod;
					  p->x=i;
					  p->y=j;
					  p->val=0;
					  p->leg=NULL;q->leg=p;
					  q=p;
					  break;
				   }
	   }
   }
   fclose(f);

   int cont=0;
   while(prim->leg)
   {
	  p=prim->leg;
	  val=p->val+1;
	  i=p->x;
	  j=p->y;
	  prim->leg=p->leg;
	  delete p;
	  p=0;
	  if(prim->leg==NULL)q=prim;

	  cont=0;
	  while(cont<4)
	  {
		 switch(cont)
		 {
			case 0:{adauga(i-1,j);break;}
			case 1:{adauga(i+1,j);break;}
			case 2:{adauga(i,j-1);break;}
			case 3:{adauga(i,j+1);break;}
		 }
		 cont++;
	  }
   }

   if(a[xi][yi].val<a[xo][yo].val)val=a[xi][yi].val;
   else val=a[xo][yo].val;
   ok=1;if(val%2)sch=1;
   if(a[xi][yi].val==MAXINT||a[xo][yo].val==MAXINT)val=-1;

   for(val;val>=0&&ok;--val)
   {
	   q=prim;
	   p=new nod;
	   p->x=xi;p->y=yi;
	   p->leg=NULL;
	   q->leg=p;
	   q=p;
	   while(prim->leg&&ok)
	   {
		  p=prim->leg;
		  prim->leg=p->leg;
		  i=p->x;
		  j=p->y;
		  delete p;
		  p=0;
		  if(!prim->leg)q=prim;
		  cont=0;
		  while(cont<4)
		  {
			  switch(cont)
			  {
				case 0:{adaugaI(i-1,j);break;}
				case 1:{adaugaI(i+1,j);break;}
				case 2:{adaugaI(i,j-1);break;}
				case 3:{adaugaI(i,j+1);break;}
			  }
			  cont++;
		  }
	  }
	  sch=!sch;
   }

   FILE*g=fopen("barbar.out","w");
   if(!ok)fprintf(g,"%d",val+1);
   else	fprintf(g,"-1");
   fclose(g);
   return 0;
}
void adauga(int i,int j)
{
	if(a[i][j].val>val)
	{
	   p=new nod;
	   p->leg=NULL;
	   p->x=i;
	   p->y=j;
	   p->val=val;
	   a[i][j].val=a[i][j].init=val;
	   q->leg=p;
	   q=p;
	}
}
void adaugaI(int i,int j)
{
	if((a[i][j].val>=val&&sch)||(a[i][j].init>=val&&!sch))
	{  if(i==xo&&j==yo){ok=0;}
	   p=new nod;
	   p->leg=NULL;
	   p->x=i;
	   p->y=j;
	   p->val=val;
	   if(sch){a[i][j].val*=-1;a[i][j].init=abs(a[i][j].init);}
	   if(!sch){a[i][j].init*=-1;a[i][j].val=abs(a[i][j].val);}
	   q->leg=p;
	   q=p;
	}
}
int abs(int x)
{
   if(x<0)x*=-1;
   return x;
}