Pagini recente » Cod sursa (job #3146818) | Cod sursa (job #3191952) | Cod sursa (job #2189300) | Cod sursa (job #2179748) | Cod sursa (job #792741)
Cod sursa(job #792741)
#include <stdio.h>
#include<string.h>
#define MAX 1000001
int m,n,a[1002][1002],dr[1002][1002],c[2][MAX],xi,yi,xf,yf,u=0,viz[1001][1001],mb;
int dx[4]={0,0,1,-1}, dy[4]={-1,1,0,0};
FILE *fin,*fout;
void citire()
{
char ch;
fin=fopen("barbar.in","r");
fscanf(fin,"%d %d\n",&m,&n);
for(int i=1;i<=m;i++)
{
for(int j=1;j<=n;j++)
{
fscanf(fin,"%c",&ch);
dr[i][j]=MAX;
if(ch=='D')
{
u++;
c[0][u]=i;
c[1][u]=j;
a[i][j]=2;
dr[i][j]=0;
}
else
if(ch=='*')
a[i][j]=MAX;
else
if(ch=='I')
{
a[i][j]=1;
xi=i;
yi=j;
}
else
if(ch=='O')
a[i][j]=3;
else a[i][j]=0;
}
fscanf(fin,"%c",&ch);
}
for(int i=0;i<=m+1;i++)
{
a[i][0]=a[i][n+1]=MAX;
dr[i][0]=dr[i][n+1]=0;
}
for(int i=0;i<=n+1;i++)
{
a[0][i]=a[m+1][i]=MAX;
dr[0][i]=dr[m+1][i]=0;
}
}
void dragoni()
{
int p=1,l,cc;
while(p<=u)
{
l=c[0][p];
cc=c[1][p];
for(int i=0;i<=3;i++)
{
if(a[l+dx[i]][cc+dy[i]]!=MAX && dr[l][cc]+1<dr[l+dx[i]][cc+dy[i]])
{
u++;
c[0][u]=l+dx[i];
c[1][u]=cc+dy[i];
dr[l+dx[i]][cc+dy[i]]=dr[l][cc]+1;
}
}
p++;
}
}
int coada(int m)
{
int p=1,u=1,l,cc;
memset(viz,0,sizeof(viz));
c[0][p]=xi;
c[1][p]=yi;
viz[xi][yi]=1;
while(p<=u)
{
l=c[0][p];
cc=c[1][p];
for(int i=0;i<=3;i++)
{
if(viz[l+dx[i]][cc+dy[i]]==0 && dr[l+dx[i]][cc+dy[i]]>=m && a[l+dx[i]][cc+dy[i]]!=MAX)
{
viz[l+dx[i]][cc+dy[i]]=1;
u++;
c[0][u]=dx[i]+l;
c[1][u]=dy[i]+cc;
if(a[l+dx[i]][cc+dy[i]]==3)
return 1;
}
}
p++;
}
return 0;
}
void cautare()
{
int p=0,u=MAX-1,m;
while(p<=u)
{
m=(p+u)/2;
int k=coada(m);
if(k==1)
{
mb=m;
p=m+1;
}
else
u=m-1;
}
}
void afisare()
{
fout=fopen("barbar.out","w");
if(mb==0)
mb=-1;
fprintf(fout,"%d",mb);
fclose(fout);
}
int main()
{
citire();
dragoni();
cautare();
afisare();
return 0;
}