Pagini recente » Cod sursa (job #383444) | Cod sursa (job #1816108) | Cod sursa (job #1374234) | Cod sursa (job #1654156) | Cod sursa (job #3317275)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
const int di[] = {0, 0, 1, -1}; //constantele pentru
const int dj[] = {1, -1, 0, 0}; //navigarea celulelor
int n, m;
int wall[1005][1005], distdragon[1005][1005], visited[1005][1005];
int starti, startj, exiti, exitj;
queue<pair<int,int>> q;
int main()
{
fin>>n>>m;
char cel;
for(int i=1; i<=n; i++) for (int j=1; j<=m; j++){ //interpretarea celulelor
fin>>cel;
if(cel=='*'){
wall[i][j]=1;
distdragon[i][j]=-2;
}
else if(cel=='D'){
q.push({i, j});
distdragon[i][j]=0;
}
else if(cel=='I'){
starti=i; startj=j;
distdragon[i][j]=-1;
}
else if(cel=='O'){
exiti=i; exitj=j;
distdragon[i][j]=-1;
}
else distdragon[i][j]=-1;
}
while(!q.empty()){ //bfs de la dragoni
int x=q.front().first, y=q.front().second;
q.pop();
for(int k=0; k<4; k++){
int nx = x+di[k];
int ny = y+dj[k];
if(nx>=1&&nx<=n &&ny>=1&&ny<=m && wall[nx][ny]==0 ){
if(distdragon[nx][ny]==-1){
distdragon[nx][ny]=distdragon[x][y]+1;
q.push(make_pair(nx, ny));
}
}
}
}
//cautare binara pentru distanta maxima de la drum la dragon
int low=0, high=n+m, best=-1, mid;
while(low<=high){
mid=(low+high)/2;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
visited[i][j]=0;
while(!q.empty()) q.pop(); //clear queue
if(distdragon[starti][startj]>=mid){
q.push(make_pair(starti, startj)); //incepem bfs ul de la start daca e <= mid
visited[starti][startj]=1;
}
while(!q.empty()) {
int x=q.front().first, y=q.front().second; //bfs
q.pop();
for(int k=0; k<4; k++){
int nx = x+di[k];
int ny = y+dj[k];
if(nx<1 || nx>n || ny<1 || ny>m) continue;
if(wall[nx][ny]==1 || visited[nx][ny]==1 || distdragon[nx][ny]<mid) continue;
visited[nx][ny]=1;
q.push(make_pair(nx, ny));
}
}
if(visited[exiti][exitj]==1){
best=mid;
low=mid+1;
} else {
high=mid-1;
}
}
fout<<best;
return 0;
}