Pagini recente » Istoria paginii runda/simulare1_martie/clasament | Istoria paginii runda/ae/clasament | Cod sursa (job #374967) | Cod sursa (job #333676) | Cod sursa (job #821043)
Cod sursa(job #821043)
#include <stdio.h>
using namespace std;
const int N=1005;
const int dlin[]={-1,1,0,0};
const int dcol[]={0,0,-1,1};
char v[N][N];
int d[N][N],dr[N][N];
int r,c;
struct element {int lin,col;};
element q[N*N],x,y,start,fin;
void lee(int obs)
{
int p,u,i,k;
p=0; u=1;
while(p<u)
{
x=q[p++];
for(i=0;i<4;i++)
{
k=x.lin+dlin[i];
if(k>=0 && k<r) y.lin=k; else continue;
k=x.col+dcol[i];
if(k>=0 && k<c) y.col=k; else continue;
if(d[y.lin][y.col]>=obs && dr[y.lin][y.col]==-1)
{
q[u++]=y;
dr[y.lin][y.col]=1+dr[x.lin][x.col];
}
}
}
}
int main()
{
FILE *in,*out;
in=fopen("barbar.in","r");
out=fopen("barbar.out","w");
int i,j,p,u,k,caut;
long long obs;
fscanf(in,"%d%d\n",&r,&c);
for(i=0;i<r;i++)
fgets(v[i],N,in);
p=u=0;
for(i=0;i<r;i++)
for(j=0;j<r;j++)
{
if(v[i][j]=='.') d[i][j]=-1;
if(v[i][j]=='*') d[i][j]=-2;
if(v[i][j]=='D') {d[i][j]=0; q[u].lin=i; q[u].col=j; u++;}
if(v[i][j]=='I') {d[i][j]=-1; start.lin=i; start.col=j;}
if(v[i][j]=='O') {d[i][j]=-1; fin.lin=i; start.col=j;}
}
while(p<u)
{
x=q[p++];
for(i=0;i<4;i++)
{
k=x.lin+dlin[i];
if(k>=0 && k<r) y.lin=k; else continue;
k=x.col+dcol[i];
if(k>=0 && k<c) y.col=k; else continue;
if(d[y.lin][y.col]==-1)
{
q[u++]=y;
d[y.lin][y.col]=1+d[x.lin][x.col];
}
}
}
/*for(i=0;i<r;i++)
{
for(j=0;j<r;j++) fprintf(out,"%d ",d[i][j]);
fprintf(out,"\n");
}*/
caut=0;
for(obs=1<<19;obs;obs/=2)
{
//printf("%lld am ajuns aici\n",caut);
q[0]=start;
for(i=0;i<r;i++)
for(j=0;j<c;j++)
dr[i][j]=-1;
dr[start.lin][start.col]=0;
lee(caut+obs);
if(dr[fin.lin][fin.col]!=-1) caut+=obs;
}
fprintf(out,"%lld",caut);
return 0;
}