Pagini recente » Cod sursa (job #2463325) | Cod sursa (job #2798918) | simulare_11.28.2018 | Cod sursa (job #2020937) | Cod sursa (job #2480728)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
pair<int,int>v[1000005];
char a[1005][1005];
int b[1005][1005],n,m,k;
int xi,yi,xo,yo;
///b[i][j]= distanta minima posibila de la poz, (i,j)
/// la un dragon
bitset<1003>c[1003];
void Citire()
{
fin>>n>>m;
for(int i=1;i<=n;i++)
fin>>(a[i]+1);
}
void Bordare()
{
int i;
for(i=0;i<=n+1;i++)
a[i][0]=a[i][m+1]='*';
for(i=0;i<=m+1;i++)
a[0][i]=a[n+1][i]='*';
}
void Initial()
{
int i,j;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
if(a[i][j]=='I') {xi=i;yi=j;}
if(a[i][j]=='O') {xo=i;yo=j;}
if(a[i][j]=='D')
{
b[i][j]=0;
k++;
v[k]={i,j};///am retinut pozitiile de D
}
else b[i][j] = 2000000;
}
}
void Distante()
{
int i,j,x,y;
while(k>0)
{
i=v[k].first;
j=v[k].second;
k--;
///nord
x=i-1;
y=j;
if(a[x][y]!='*' && b[x][y]>1+b[i][j])
{
b[x][y]=1+b[i][j];
k++;
v[k]={x,y};
}
///sud
x=i+1;
y=j;
if(a[x][y]!='*' && b[x][y]>1+b[i][j])
{
b[x][y]=1+b[i][j];
k++;
v[k]={x,y};
}
///est
x=i;
y=j+1;
if(a[x][y]!='*' && b[x][y]>1+b[i][j])
{
b[x][y]=1+b[i][j];
k++;
v[k]={x,y};
}
///vest
x=i;
y=j-1;
if(a[x][y]!='*' && b[x][y]>1+b[i][j])
{
b[x][y]=1+b[i][j];
k++;
v[k]={x,y};
}
}
}
void Afisare()
{
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
if(b[i][j]!=2000000) fout<<b[i][j]<<" ";
else fout<<"x ";
fout<<"\n";
}
}
///Verific daca pot ajunge de la i la o
/// mergand doar pe valori mai mari sau egale decat val
void Fill(short i,short j,int val)
{
if(a[i][j]!='*' && b[i][j]>=val && c[i][j]==0)
{
c[i][j]=1;
Fill(i-1,j,val);
Fill(i+1,j,val);
Fill(i,j-1,val);
Fill(i,j+1,val);
}
}
void Rezolva()
{
int i,j;
for(i=b[xi][yi];i>=i;i--)
{
for(j=1;j<=n;j++)
c[j].reset();
///incerc sa vad daca pot ajunge din (xi,yi)
///in (xo,yo) mergand doar pe valori >= i
Fill(xi,yi,i);
if(c[xo][yo]==1)
{
fout<<i<<"\n";
fout.close();
return;
}
}
fout<<"-1\n";
fout.close();
}
int main()
{
Citire();
Bordare();
Initial();
Distante();
Rezolva();
return 0;
}