Pagini recente » Cod sursa (job #1735996) | Cod sursa (job #599682) | Cod sursa (job #3249686) | Cod sursa (job #365107) | Cod sursa (job #2951516)
#include <bits/stdc++.h>
using namespace std;
#define N 1007
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int di[]={-1, 1, 0, 0}, dj[]={0, 0, -1, 1};
int n, m, mat[N][N], d[N][N], v[N][N];
pair<int, int> paftenie, iesire;
vector<pair<int,int>> dragoni;
void print_mat(int a[][N], int n, int m)
{
for(int i=1; i<=n; i++)
{
for(int j=1; j<=m; j++)
cout<<a[i][j]<<' ';
cout<<'\n';
}
cout<<"\n\n";
}
void read()
{
fin>>n>>m;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
{
char c;
fin>>c;
d[i][j] = -1;
if(c=='*')
mat[i][j] = -1;
else
mat[i][j] = 0;
if(c=='I')
{
paftenie.first = i;
paftenie.second = j;
}
if(c=='O')
{
iesire.first = i;
iesire.second = j;
}
if(c=='D')
{
d[i][j] = 0;
dragoni.push_back(make_pair(i, j));
}
}
}
bool ok1(int i, int j)
{
return (mat[i][j]==0 && d[i][j] == -1 && i<=n && i>=1 && j<=m && j>=1);
}
bool ok2(int i, int j, int X)
{
return (i>=1 && i<=n && j>=1 && j<=m && mat[i][j] == 0 && d[i][j]>=X && v[i][j]==-1);
}
void dist_to_dragons()
{
queue<pair<int, int>> Q;
for(auto &dragon:dragoni)
Q.push(dragon);
while(!Q.empty())
{
int i_curr = Q.front().first;
int j_curr = Q.front().second;
Q.pop();
for(int i=0; i<4; i++)
{
int i_vecin = i_curr + di[i];
int j_vecin = j_curr + dj[i];
if(ok1(i_vecin, j_vecin))
{
Q.push(make_pair(i_vecin, j_vecin));
d[i_vecin][j_vecin] = d[i_curr][j_curr] + 1;
}
}
}
}
bool check_path(int X)
{
queue<pair<int,int>> Q;
for(int i=0; i<=n; i++)
for(int j=0; j<=m; j++)
v[i][j]=-1;
v[paftenie.first][paftenie.second] = 0;
Q.push(paftenie);
while(!Q.empty())
{
int i_curr = Q.front().first;
int j_curr = Q.front().second;
Q.pop();
for(int i=0; i<4; i++)
{
int i_vecin = i_curr + di[i];
int j_vecin = j_curr + dj[i];
if(ok2(i_vecin, j_vecin, X))
{
Q.push(make_pair(i_vecin, j_vecin));
v[i_vecin][j_vecin] = v[i_curr][j_curr] + 1;
}
}
}
if(v[iesire.first][iesire.second]>-1)
return true;
else
return false;
}
int main()
{
read();
print_mat(mat, n, m);
print_mat(d, n, m);
dist_to_dragons();
print_mat(d, n, m);
int st=1, dr=N, sol=-1;
while(st<=dr)
{
int mij = st + (dr-st)/2;
if(check_path(mij))
{
sol = max(sol, mij);
st = mij + 1;
}
else
dr = mij - 1;
}
if(d[paftenie.first][paftenie.second] < sol)
sol = d[paftenie.first][paftenie.second];
cout<<sol;
fout<<sol;
return 0;
}