Pagini recente » Cod sursa (job #277838) | Cod sursa (job #1731672) | Clasament bulangandit6 | Cod sursa (job #1878379) | Cod sursa (job #363345)
Cod sursa(job #363345)
#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;
}