Pagini recente » Cod sursa (job #2589436) | Cod sursa (job #3277817) | Cod sursa (job #326205) | Cod sursa (job #2091819) | Cod sursa (job #2923460)
#include <iostream>
#include <fstream>
#include <queue>
#include <cstring>
#define N 1005
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int n,m,i,j;
char a[N][N];
int d[N][N];
int aparitie[N][N],ok[N][N];
struct celula
{
int x,y;
};
int cnt_dragoni;
celula dragoni[N];
celula start,iesire;
queue<celula> Q;
int vx[5]={-1,0,1,0};
int vy[5]={0,1,0,-1};
void bordare()
{
for(i=0;i<=n+1;i++) aparitie[i][0]=aparitie[i][m+1]=1;
for(j=0;j<=m+1;j++) aparitie[0][j]=aparitie[n+1][j]=1;
}
int valid(celula cell)
{
if(aparitie[cell.x][cell.y]==0) return 1;
else return 0;
}
void distanta()
{
for(i=1;i<=cnt_dragoni;i++) Q.push(dragoni[i]),aparitie[dragoni[i].x][dragoni[i].y]=1;
while(!Q.empty())
{
celula curent=Q.front(); Q.pop();
for(i=0;i<4;i++)
{
celula vecin;
vecin.x=curent.x + vx[i];
vecin.y=curent.y + vy[i];
if(valid(vecin))
{
aparitie[vecin.x][vecin.y]=1;
d[vecin.x][vecin.y]=d[curent.x][curent.y]+1;
Q.push(vecin);
}
}
}
}
int main()
{
fin>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
fin>>a[i][j];
if(a[i][j]=='*') d[i][j]=-1,aparitie[i][j]=1;
if(a[i][j]=='D') dragoni[++cnt_dragoni]={i,j};
if(a[i][j]=='I') start={i,j};
if(a[i][j]=='O') iesire={i,j};
}
bordare();
distanta();
/*for(i=1;i<=n;i++,cout<<endl)
for(j=1;j<=m;j++)
cout<<d[i][j]<<" ";*/
int sol=-1;
int ls,medie,ld;
ls=1; ld=n+m;
while(ls<=ld)
{
int da_nu=1;
medie=(ls+ld)/2;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
aparitie[i][j]=ok[i][j]=0;
if(d[start.x][start.y]>=medie)
{
Q.push(start);
aparitie[start.x][start.y]=1;
ok[start.x][start.y]=1;
}
else da_nu=0;
while(!Q.empty() && da_nu)
{
celula curent=Q.front(); Q.pop(); aparitie[curent.x][curent.y]=1;
int vx[5]={-1,0,1,0};
int vy[5]={0,1,0,-1};
for(i=0;i<4;i++)
{
celula vecin;
vecin={curent.x+vx[i],curent.y+vy[i]};
if(aparitie[vecin.x][vecin.y]==0)
{
aparitie[vecin.x][vecin.y]=1;
if(d[vecin.x][vecin.y]>=medie)
{
ok[vecin.x][vecin.y]=1;
Q.push(vecin);
}
}
}
}
if(ok[iesire.x][iesire.y]==0) ld=medie-1;
else {sol=medie; ls=medie+1;}
}
fout<<sol;
return 0;
}