Pagini recente » Cod sursa (job #1156255) | Cod sursa (job #2655378) | Cod sursa (job #1801159) | Cod sursa (job #497048) | Cod sursa (job #1696458)
#include <iostream>
#include <fstream>
#include <queue>
using namespace std;
struct punct {
int i;
int j;
} start,finish,dir[]={{-1,0},{1,0},{0,-1},{0,1}};
int r,c,m[1005][1005];
bool viz[1005][1005];
queue<punct> coada;
bool isOk(punct poz) {
return (poz.i>=1&&poz.i<=r&&poz.j>=1&&poz.j<=c&&m[poz.i][poz.j]!=-1);
}
void lee(int minim) {
for(int i=1;i<=r;i++)
for(int j=1;j<=c;j++)
viz[i][j]=false;
punct poz,pozUrm;
while(!coada.empty())
coada.pop();
coada.push(start);
viz[start.i][start.j]=true;
while(!coada.empty()) {
poz=coada.front();
for(int k=0;k<4;k++) {
pozUrm={poz.i+dir[k].i,poz.j+dir[k].j};
if(isOk(pozUrm)&&m[pozUrm.i][pozUrm.j]>=minim&&!viz[pozUrm.i][pozUrm.j]) {
viz[pozUrm.i][pozUrm.j]=true;
coada.push(pozUrm);
}
}
coada.pop();
}
}
int formMatrice() {
int maxim=0;
punct poz,pozUrm;
while(!coada.empty()) {
poz=coada.front();
for(int k=0;k<4;k++) {
pozUrm={poz.i+dir[k].i,poz.j+dir[k].j};
if(isOk(pozUrm)&&m[pozUrm.i][pozUrm.j]==0) {
m[pozUrm.i][pozUrm.j]=m[poz.i][poz.j]+1;
if(m[pozUrm.i][pozUrm.j]>maxim)
maxim=m[pozUrm.i][pozUrm.j];
coada.push(pozUrm);
}
}
coada.pop();
}
return maxim;
}
int main()
{
ifstream fin("barbar.in");
ofstream fout("barbar.out");
fin>>r>>c;
char caracter;
for(int i=1;i<=r;i++)
for(int j=1;j<=c;j++) {
fin>>caracter;
if(caracter=='*')
m[i][j]=-1;
else if(caracter=='I')
start={i,j};
else if(caracter=='D') {
m[i][j]=1;
coada.push({i,j});
}
else if(caracter=='O')
finish={i,j};
}
int st=1,dr=formMatrice(),mij,best=0;
while(st<=dr) {
mij=(st+dr)/2;
lee(mij);
if(!viz[finish.i][finish.j])
dr=mij-1;
else {
st=mij+1;
best=mij;
}
}
fout<<best-1<<'\n';
return 0;
}