Pagini recente » Cod sursa (job #2595678) | Cod sursa (job #1812982) | Cod sursa (job #2677078) | Cod sursa (job #1858943) | Cod sursa (job #2553176)
#include <iostream>
#include <fstream>
#include <queue>
std::ifstream f("barbar.in");
std::ofstream g("barbar.out");
const int NMAX = 1005;
const int dx[] = { 1 , -1 , 0 , 0 };
const int dy[] = { 0 , 0 , 1 , -1 };
int n,m,cost[NMAX][NMAX],maxx;
char a[NMAX][NMAX];
bool vis[NMAX][NMAX];
std::queue< std::pair<int,int> >Q;
std::pair<int,int>coordonates,destination;
bool isValid(int i,int j){
return i >= 1 && i <= n && j >= 1 && j <= m;
}
bool lee(int mid){
while(!Q.empty())
Q.pop();
for(int i = 1;i <= n;++i)
for(int j = 1;j <= m;++j)
vis[i][j] = false;
vis[coordonates.first][coordonates.second] = true;
Q.push(coordonates);
while(!Q.empty()){
int i = Q.front().first;
int j = Q.front().second;
Q.pop();
for(int dir = 0;dir < 4;++dir){
int next_i = i + dx[dir];
int next_j = j + dy[dir];
if(isValid(next_i,next_j) && !vis[next_i][next_j] &&
a[next_i][next_j] != '*' && cost[next_i][next_j] > mid){
if(destination.first == next_i && destination.second == next_j)
return true;
vis[next_i][next_j] = true;
Q.push({next_i,next_j});
}
}
}
return false;
}
int main(){
f >> n >> m;
for(int i = 1;i <= n;++i){
for(int j = 1;j <= m;++j){
f >> a[i][j];
if(a[i][j] == 'D'){
Q.push({i,j});
cost[i][j] = 1;
}else if(a[i][j] == 'I')
coordonates = {i,j};
else if(a[i][j] == 'O')
destination = {i,j};
}
}
while(!Q.empty()){
int i = Q.front().first;
int j = Q.front().second;
Q.pop();
for(int dir = 0;dir < 4;++dir){
int next_i = i + dx[dir];
int next_j = j + dy[dir];
if(isValid(next_i,next_j) && a[next_i][next_j] != '*'
&& cost[next_i][next_j] == 0){
cost[next_i][next_j] = 1 + cost[i][j];
Q.push({next_i,next_j});
}
}
}
for(int i = 1;i <= n;++i)
for(int j = 1;j <= m;++j)
maxx = std::max(cost[i][j],maxx);
int left = 1;
int right = maxx;
int sol = -1;
while(left <= right){
int mid = (left + right) / 2;
if(lee(mid)){
left = mid + 1;
sol = mid;
}else{
right = mid - 1;
}
}
g << 1;
return 0;
}