Pagini recente » Cod sursa (job #1526992) | Cod sursa (job #1860966) | Cod sursa (job #1312170) | Cod sursa (job #595875) | Cod sursa (job #2951691)
#include <iostream>
#include <fstream>
#include <bits/stdc++.h>
#define nmax 1005
#define abs(a,b) ((a>b)?(a-b):(b-a))
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int n,m;
int mat[nmax][nmax];
int ras[nmax][nmax];
int istop,jstop;
queue<pair<int,int>>Q;
vector<pair<int,int>>Vec;
const int di[4]={-1,0,1,0};
const int dj[4]={0,1,0,-1};
bool ebun(int i,int j)
{
return i>=1 && i<=n && j>=1 && j<=m;
}
int dist(int x1,int y1,int x2,int y2)
{
return abs(x1,x2)+abs(y1,y2);
}
void citire()
{
fin>>n>>m;
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
{
char lit;
fin>>lit;
if(lit=='I')
Q.push({i,j});
else if(lit=='O')
{
istop=i;
jstop=j;
}
else if(lit=='*')
mat[i][j]=1;
else if(lit=='D')
{
mat[i][j]=1;
Vec.push_back({i,j});
}
}
}
int minimul_dragoni(int startx,int starty)
{
int dist_min=INT_MAX;
for (auto &x:Vec)
dist_min=min(dist_min,dist(startx,starty,x.first,x.second));
return dist_min;
}
void Lee()
{
int startx=Q.front().first;
int starty=Q.front().second;
int dist_min=INT_MAX;
for (auto &x:Vec)
dist_min=min(dist_min,dist(startx,starty,x.first,x.second));
ras[startx][starty]=dist_min;
while(!Q.empty())
{
int i=Q.front().first;
int j=Q.front().second;
Q.pop();
for (int dir=0;dir<4;++dir)
{
int i_nou=i+di[dir];
int j_nou=j+dj[dir];
if(ebun(i_nou,j_nou) && mat[i_nou][j_nou]==0 && ras[i_nou][j_nou]==0)
{
ras[i_nou][j_nou]=min(ras[i][j],minimul_dragoni(i_nou,j_nou));
Q.push({i_nou,j_nou});
}
else if(ebun(i_nou,j_nou) && mat[i_nou][j_nou]==0 && ras[i_nou][j_nou]!=0)
{
ras[i_nou][j_nou]=max(ras[i_nou][j_nou],ras[i][j]);
}
}
}
fout<<ras[istop][jstop];
}
int main()
{citire();
Lee();
return 0;
}