Pagini recente » Cod sursa (job #3320194) | Cod sursa (job #3319723) | Cod sursa (job #3318346) | Cod sursa (job #3303142) | Cod sursa (job #3355609)
#include <fstream>
#include <cmath>
#include <algorithm>
#include <queue>
#include <string>
#include <unordered_map>
#include <vector>
using namespace std;
ifstream cin("barbar.in");
ofstream cout("barbar.out");
char mat[1001][1001];
int dis[1001][1001], disV2[1001][1001];
queue<pair<int, int>> q;
int di[4]={-1, 0, 1, 0};
int dj[4]={0, 1, 0, -1};
void Lee(int n, int m)
{
int i, j;
while(!q.empty())
{
i=q.front().first;
j=q.front().second;
q.pop();
for(int k=0; k<4; k++)
{
int iv=i+di[k];
int jv=j+dj[k];
if(iv>=1 && iv<=n && jv>=1 && jv<=n && mat[iv][jv]!='*' && dis[iv][jv]>dis[i][j]+1)
{
dis[iv][jv]=dis[i][j]+1;
q.push({iv, jv});
}
}
}
}
void LeeV2(int n, int m, int i, int j, int mij)
{
q.push({i, j});
disV2[i][j]=0;
while(!q.empty())
{
i=q.front().first;
j=q.front().second;
q.pop();
for(int k=0; k<4; k++)
{
int iv=i+di[k];
int jv=j+dj[k];
if(iv>=1 && iv<=n && jv>=1 && jv<=n && mat[iv][jv]!='*' && disV2[iv][jv]>disV2[i][j]+1 && dis[iv][jv]>=mij)
{
disV2[iv][jv]=disV2[i][j]+1;
q.push({iv, jv});
}
}
}
}
int main(){
int n, m, iI, jI, iO, jO;
cin >> n >> m;
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
cin >> mat[i][j];
if(mat[i][j]=='I')
{
iI=i;
jI=j;
}
else if(mat[i][j]=='O')
{
iO=i;
jO=j;
}
if(mat[i][j]=='D')
{
q.push({i, j});
dis[i][j]=0;
}
else
dis[i][j]=21e8;
}
}
Lee(n, m);
int st=0, dr=1000000, mij, rasp=0;
while(st<=dr)
{
mij=(st+dr)/2;
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
{
disV2[i][j]=21e8;
}
}
LeeV2(n, m, iI, jI, mij);
if(disV2[iO][jO]!=21e8)
{
rasp=mij;
st=mij+1;
}
else
dr=mij-1;
}
cout << rasp;
return 0;
}