Pagini recente » Cod sursa (job #2640748) | Cod sursa (job #2419196) | Cod sursa (job #1724461) | Cod sursa (job #1278844) | Cod sursa (job #1712244)
#include <fstream>
#include <queue>
#define DIM 1005
using namespace std;
struct punct {
int i;
int j;
};
int n,m,harta[DIM][DIM],maxim;
punct start, finish;
queue<punct> coada;
bool isOk(punct poz) {
return (poz.i>=1&&poz.i<=n&&poz.j>=1&&poz.j<=m&&harta[poz.i][poz.j]!=-1);
}
bool traverse(int op) {
if(op>=0&&harta[start.i][start.j]<op)
return false;
if(op>=0)
coada.push(start);
punct poz,pozUrm,dir[]={{-1,0},{1,0},{0,-1},{0,1}};
bool viz[DIM][DIM];
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
viz[i][j]=false;
viz[start.i][start.j]=true;
while(!coada.empty()) {
poz=coada.front();
for(int i=0;i<4;i++) {
pozUrm={poz.i+dir[i].i,poz.j+dir[i].j};
if(isOk(pozUrm)) {
if(op==-1&&harta[pozUrm.i][pozUrm.j]==0) {
harta[pozUrm.i][pozUrm.j]=harta[poz.i][poz.j]+1;
if(harta[pozUrm.i][pozUrm.j]>maxim)
maxim=harta[pozUrm.i][pozUrm.j];
coada.push(pozUrm);
}
else if(op>=0&&harta[pozUrm.i][pozUrm.j]>=op&&!viz[pozUrm.i][pozUrm.j]) {
viz[pozUrm.i][pozUrm.j]=true;
coada.push(pozUrm);
}
}
}
coada.pop();
}
if(viz[finish.i][finish.j])
return true;
return false;
}
int getDist() {
int dist=0,st=1,dr=maxim,mij;
while(st<=dr) {
mij=(st+dr)/2;
if(traverse(mij))
dist=mij,st=mij+1;
else
dr=mij-1;
}
return dist-1;
}
int main()
{
ifstream fin("barbar.in");
ofstream fout("barbar.out");
fin>>n>>m;
char car;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++) {
fin>>car;
if(car=='*')
harta[i][j]=-1;
else if(car=='I')
start={i,j};
else if(car=='D') {
coada.push({i,j});
harta[i][j]=1;
}
else if(car=='O')
finish={i,j};
}
traverse(-1);
fout<<getDist();
return 0;
}