Pagini recente » Cod sursa (job #863578) | Cod sursa (job #2177657) | Cod sursa (job #396748) | Cod sursa (job #2820978) | Cod sursa (job #2786212)
#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> pii;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int n,m;
int diri[5]={0,0,1,-1};
int dirj[5]={-1,1,0,0};
char v[1005][1005];
int dist[1005][1005],best[1005][1005];
queue<pii> coada;
int main()
{
fin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
dist[i][j]=1e9;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
fin>>v[i][j];
if(v[i][j]=='D')
{
coada.push({i,j});
dist[i][j]=0;
}
}
while(!coada.empty())
{
int x=coada.front().first,y=coada.front().second;
coada.pop();
for(int p=0;p<4;p++)
{
int l=x+diri[p];
int c=y+dirj[p];
if(l>0&&l<=n&&c>0&&c<=m)
if(dist[l][c]>dist[x][y]+1)
{
dist[l][c]=dist[x][y]+1;
coada.push({l,c});
}
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(v[i][j]=='I')
{
coada.push({i,j});
best[i][j]=dist[i][j];
}
while(!coada.empty())
{
int x=coada.front().first,y=coada.front().second;
coada.pop();
for(int p=0;p<4;p++)
{
int l=x+diri[p];
int c=y+dirj[p];
if(l>0&&l<=n&&c>0&&c<=m)
if(v[l][c]!='*'&&v[l][c]!='D'&&best[l][c]<min(best[x][y],dist[l][c]))
{
best[l][c]=min(best[x][y],dist[l][c]);
coada.push({l,c});
}
}
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(v[i][j]=='O')
fout<<best[i][j];
return 0;
}