Pagini recente » Cod sursa (job #274605) | Cod sursa (job #144118) | Cod sursa (job #101677) | Cod sursa (job #3145111) | Cod sursa (job #2971478)
#include <iostream>
#include <fstream>
#include <queue>
#include <cstring>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int n, m, d[1001][1001], xi, yi, xf, yf;
short int mat[1001][1010];
bool viz[1001][1001];
int dy[] = {0, 1, 0, -1}, dx[] = {-1, 0, 1, 0};
struct punct
{
int l, c;
};
queue <punct> q;
int lee(int k)
{
memset(viz, 0, sizeof(viz));
if(d[xi][yi] > k)
{
q.push({xi, yi});
viz[xi][yi] = 1;
}
else
return 0;
while(!q.empty())
{
int l = q.front().l;
int c = q.front().c;
q.pop();
for(int i = 0; i <= 3; i++)
{
int lv = l + dx[i];
int cv = c + dy[i];
if(lv >= 1 && lv <= n && cv >= 1 && cv <= m)
{
if(mat[lv][cv] == 0 && viz[lv][cv] == 0 && d[lv][cv] > k)
{
viz[lv][cv] = 1;
q.push({lv, cv});
}
}
}
}
return viz[xf][yf];
}
int main()
{
fin >> n >> m;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
{
char ch;
fin >> ch;
if(ch == 'D')
{
mat[i][j] = 2;
q.push({i, j});
d[i][j] = 1;
}
else if(ch == '*')
mat[i][j] = 1;
else if(ch == 'I')
{
xi = i;
yi = j;
}
else if(ch == 'O')
{
xf = i;
yf = j;
}
}
while(!q.empty())
{
int l = q.front().l;
int c = q.front().c;
q.pop();
for(int i=0; i<=3; i++)
{
int lv = l + dx[i];
int cv = c + dy[i];
if(lv >= 1 && lv <= n && cv >= 1 && cv <= m)
{
if(mat[lv][cv] == 0 && d[lv][cv] == 0)
{
d[lv][cv] = d[l][c] + 1;
q.push({lv, cv});
}
}
}
}
int st = 0, dr = n * m, sol = -1;
while(st <= dr)
{
int mid = (dr+st) / 2;
int ok = lee(mid);
if(ok == 1)
{
sol = mid;
st = mid + 1;
}
else
dr = mid - 1;
}
fout << sol;
return 0;
}