Pagini recente » Cod sursa (job #1963888) | Cod sursa (job #2579854) | Cod sursa (job #1914612) | Cod sursa (job #954947) | Cod sursa (job #2571429)
#include <iostream>
#include <fstream>
#include <queue>
#include <cstring>
#define NMAX 1000
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
int n, m, v[NMAX+10][NMAX+10];
int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, 1, 0, -1};
pair <int, int> start, exit;
bool viz[NMAX+10][NMAX+10], w[NMAX+10][NMAX+10];
queue <pair <int, int> > Q;
void bfsDragoni()
{ while(!Q.empty())
{ pair <int, int> a = Q.front();
Q.pop();
for(int t=0; t<4; t++)
{ pair <int, int> vec;
vec.first = a.first + dx[t];
vec.second = a.second + dy[t];
if(vec.first && vec.second && vec.first <= n && vec.second <= m
&& !viz[vec.first][vec.second])
{ viz[vec.first][vec.second] = 1;
v[vec.first][vec.second] = v[a.first][a.second] + 1;
Q.push(vec);
}
}
}
}
int isOk(int val)
{ while(!Q.empty()) Q.pop();
memset(viz, 0, sizeof(viz));
Q.push(start);
viz[start.first][start.second] = 1;
while(!Q.empty())
{ pair <int, int> a = Q.front();
Q.pop();
if(a.first == exit.first && a.second == exit.second) return 1;
for(int t=0; t<4; t++)
{ pair <int, int> vec;
vec.first = a.first + dx[t];
vec.second = a.second + dy[t];
if(vec.first && vec.second && vec.first <= n && vec.second
&& !w[vec.first][vec.second] && !viz[vec.first][vec.second] && v[vec.first][vec.second] >= val)
{ viz[vec.first][vec.second] = 1;
Q.push(vec);
}
}
}
return 0;
}
int main()
{
f >> n >> m;
for(int i=1; i<=n; i++)
{ string s;
f >> s;
for(int j=0; j<m; j++)
{ if(s[j] == '.') continue;
else if(s[j] == 'D') Q.push(make_pair(i, j+1)), viz[i][j+1] = 1;
else if(s[j] == '*') viz[i][j+1] = 1, w[i][j+1] = 1;
else if(s[j] == 'I') start = make_pair(i, j+1);
else if(s[j] == 'O') exit = make_pair(i, j+1);
}
}
bfsDragoni();
int st=1, dr=2*NMAX;
while(st <= dr)
{ int mij = (st + dr) / 2;
if(isOk(mij)) st = mij + 1;
else dr = mij - 1;
}
g << dr << '\n';
return 0;
}