Pagini recente » Cod sursa (job #2322706) | Cod sursa (job #629520) | Cod sursa (job #2489203) | Cod sursa (job #1367111) | Cod sursa (job #2929719)
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
queue<pair<int,int>>q;
vector<vector<bool>>obstacol;
vector<vector<int>>distanta;
vector<int>dirX={1,-1,0,0};
vector<int>dirY={0,0,1,-1};
vector<vector<int>>folosit;
ifstream cin("barbar.in");
ofstream cout("barbar.out");
const int inf=1e9;
int main(){
int n,m;
cin>>n>>m;
obstacol.resize(n+1,vector<bool>(m+1,false));
distanta.resize(n+1,vector<int>(m+1,inf));
folosit.resize(n+1,vector<int>(m+1));
char c;
pair<int,int>inceput,sfarsit;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>c;
if(c=='*'){
obstacol[i][j]=true;
}
if(c=='D'){
distanta[i][j]=0;
q.push({i,j});
}
if(c=='I'){
inceput={i,j};
}
if(c=='O'){
sfarsit={i,j};
}
}
}
while (!q.empty()) {//fac din fiecare dragon distanta minima pana la fiecare pozitie din matrice
pair < int, int > now = q.front();
q.pop();
for (int i = 0; i < 4; i++) {
int x = now.first + dirX[i];
int y = now.second + dirY[i];
if (x < 1 || x > n || y < 1 || y > m) {
continue;
}
if (obstacol[x][y]) {
continue;
}
if (distanta[x][y] != inf) {
continue;
}
distanta[x][y] = distanta[now.first][now.second] + 1;
q.push({ x , y });
}
}
int ans=-1;
int stanga=1,dreapta=distanta[inceput.first][inceput.second];
while(stanga<=dreapta){
int mij=stanga+dreapta;
mij/=2;
q.push(inceput);
folosit[inceput.first][inceput.second]=1;
while(!q.empty()){
pair<int,int>pozInt=q.front();
q.pop();
for(int i=0;i<=3;i++){
int x=pozInt.first+dirX[i];
int y=pozInt.second+dirY[i];
if(x<1 || x>n || y<1 || y>m){
continue;
}
if(distanta[x][y]<mij){
continue;
}
if(obstacol[x][y]){
continue;
}
if(folosit[x][y]){
continue;
}
folosit[x][y]=1;
q.push({x,y});
}
}
if(folosit[sfarsit.first][sfarsit.second]){
ans=mij;
stanga=mij+1;
}else{
dreapta=mij-1;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
folosit[i][j]=0;
}
}
}
cout<<ans;
}